简单认识动态数组_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 简单认识动态数组

简单认识动态数组

 2014/11/14 19:07:12  VIP庚  程序员俱乐部  我要评论(0)
  • 摘要:什么是数组?数组是具有相同的数据类型且按一定次序排列的一组变量的集合体一维数组:连续内存的,线性的,有下标的,长度固定的动态数组:连续内存的,线性的,有下标的,长度可变的说到动态数组那么不如自己定义一个publicclassDynamicArray2<E>{introngliang=10;//容量intbilv=10;//增长比率Object[]src=newObject[rongliang];publicDynamicArray2(){}publicDynamicArray2
  • 标签:认识 数组
什么是数组?
数组是具有相同的数据类型且按一定次序排列的一组变量的集合体

一维数组:连续内存的,线性的,有下标的,长度固定的
动态数组: 连续内存的,线性的,有下标的 ,长度可变的

说到动态数组 那么不如自己定义一个


class="java" name="code">public class DynamicArray2<E> {

	int rongliang = 10;// 容量
	int bilv = 10;// 增长比率
    Object[] src = new Object[rongliang];

	public DynamicArray2(){
		
	}
	
	public DynamicArray2(int rongliang, int bilv) {
		this.rongliang = rongliang;
		this.bilv = bilv;
		Object[] src = new Object[rongliang];
	}

	// 三个新概念
	// 容量,增长比率,可变数组长度(元素个数)

	// 定义一个原始数组
	

	/**
	 * 查找数组中第一个为null的位置下标
	 * 
	 * @return
	 */
	private int getNullIndex() {
		for (int i = 0; i < src.length; i++) {
			if (src[i] == null) {
				return i;
			}
		}
		return -1;
	}

	/**
	 * 将指定元素放入数组
	 * 
	 * @param s
	 *            要放入的元素内容
	 */
	public void add(E s) {
		// 如果长度<容量,不需要新数组
		if (size() >= src.length) {
			// 定义一个新数组,长度是原始数组长度+1
			Object[] dest = new Object[src.length + bilv];
			// 将原始数组中的数据考入新数组
			for (int i = 0; i < src.length; i++) {
				dest[i] = src[i];
			}

			// 将src指向新数组
			src = dest;
		}

		int index = getNullIndex();
		src[index] = s;

	}

	/**
	 * 根据下标取出元素
	 * 
	 * @param index
	 *            要取出的元素的下标
	 * @return 返回取得的元素
	 */
	public E get(int index) {
		if (index < 0 || index >= size()) {
			throw new RuntimeException("给定的index超出范围:size:" + size()
					+ ",index:" + index);
		}

		E s = (E)src[index];
		return s;
	}

	/**
	 * 获得数组中的元素个数 返回数组中连续的不为null的元素个数
	 * 
	 * @return 返回获得的元素个数
	 */
	public int size() {
		int count = 0;
		for (int i = 0; i < src.length; i++) {
			if (src[i] != null) {
				count++;
			} else {
				break;
			}

		}

		return count;
	}

	/**
	 * 将指定的元素放入指定的位置
	 * 
	 * @param s
	 *            要放入的元素
	 * @param index
	 *            元素所在的位置
	 */
	public void insert(E s, int index) {
		if (size() >= src.length) {
			// 定义一个新数组,长度是原始数组长度+1
			Object[] dest = new Object[src.length + bilv];
			// 将原始数组中的数据考入新数组
			for (int i = 0; i < src.length; i++) {
				dest[i] = src[i];
			}

			// 将src指向新数组
			src = dest;
		}
		for(int i=size();i>index;i--){
			src[i]=src[i-1];
		}
		src[index]=s;
		
	}

	/**
	 * 修改指定位置的元素
	 * 
	 * @param s
	 *            修改后的新元素
	 * @param index
	 *            元素的位置
	 */
	public void modify(E s, int index) {
		src[index] = s;
	}

	/**
	 * 删除指定位置的元素
	 * 
	 * @param index
	 *            要删除的元素的位置
	 * @return 返回被删除的元素
	 */
	public E delete(int index) {
		E e = (E)src[index];
		for(int i=index;i<size();i++){
			src[i] =src[i+1]; 
		}
		
		return e;
	}

	/**
	 * 删除指定的元素
	 * 
	 * @param s
	 *            要删除的元素
	 */
	public void delete(E s) {
		int index = -1;
		for (int i = 0; i < src.length; i++) {
			if (src[i].equals(s)) {
				index = i;
				break;
			}
		}

		delete(index);
	}

}


在java 中 已经为我们定义了集合框架(接口)   Collection
Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。

Set    不允许重复元素的一组数据集合   无下标   无序
        HashSet    TreeSet
List   允许重复元素   带下标  有序
        ArrayList


HashSet:
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。

将数据放入HashSet中
public static void hashSetDemo() {
		// 创建集合对象
		HashSet<String> set = new HashSet<String>();

		// 放入元素
		for (int i = 0; i < 10; i++) {
			String s = "张三" + i;
			set.add(s);
		}

		set.add("李四");
		boolean b = set.add("李四");
		System.out.println(b);

		boolean b2 = set.contains("李四");
		System.out.println(b2);

		// 取出元素,使用迭代器
		// Iterator<String> iter = set.iterator();
		// while(iter.hasNext()){
		// //取出并移除元素
		// String s = iter.next();
		// System.out.println(s);
		// }

		// 取出元素,使用增强for循环
		for (String s : set) {
			System.out.println(s);
		}

	}


对于set集合 取出集合中的元素  有两种方法

方法一  通过获得迭代器的方法

Set接口中  public Iterator<E> iterator() 函数
返回对此 set 中元素进行迭代的迭代器。返回元素的顺序并不是特定的
再通过  Iterator类中的  E next() 返回迭代的下一个元素

Iterator<String> iter = set.iterator();
 while(iter.hasNext()){
	//取出并移除元素
         String s = iter.next();
        System.out.println(s);
 }


注:1 迭代器中 每取出一个元素  都会将元素移除迭代器  但对Set集合没哟影响
    2 Iterator类中hasNext()函数  如果仍有元素可以迭代,则返回 true


方法二 : 用使用增强for循环来取出元素

for (String s : set) {
			System.out.println(s);
		}





TreeSet:

public static void treeSetDemo(){
		//创建TreeSet对象
		TreeSet<Integer> set = new TreeSet<Integer>();
		
		set.add(100);
		set.add(80);
		set.add(110);
		set.add(120);
		set.add(119);
		set.add(1);
		
		Integer tt = new Integer(111);
		set.add(tt);
		
		Integer tt1 = new Integer(111);
		set.add(tt1);
		
//		返回此 set 中所包含元素的逆序视图
		NavigableSet<Integer> nset = set.descendingSet();
		
		for(int t:nset){
			System.out.println(t);
		}
		
		//获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null。
//		while(!set.isEmpty()){
//			int t = set.pollLast();
//			System.out.println(t);
//		}
		
	}



接口 Map<K,V>   将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

键:是一个set,不重复,无下标  无序
值:每个键对应一个值,可重复

一个键只能对应一个值
一个值只能指向一个键



public static void main(String[] args) {
		//映射存储学号和姓名
		HashMap<Integer,String> map = new HashMap<Integer,String>();
		
		//放入数据
		map.put(123, "张三疯");
		map.put(124, "郭靖");
		map.put(125, "张无忌");
		map.put(126, "张翠山");
		
		//如果key重复,则会替换key对应的value
		map.put(126, "苗翠花");
		map.put(126, "翠花");
		
		/*
		//取出数据:根基EntrySet
		Set<Map.Entry<Integer, String>> set = map.entrySet();
		
		//Map.Entry:一个键值对就是一个Entry对象
		for(Map.Entry<Integer, String> entry:set){
			
			int key = entry.getKey();
			String value = entry.getValue();
			System.out.println(key+">>>"+value);
			
		}
		*/
		
		
		//遍历方式二:根据KeySet
		Set<Integer> set = map.keySet();
		for(int key:set){
			String value = map.get(key);
			System.out.println(key+">>>"+value);
		}
		
	}



注:
1  HashMap中 如果key重复,则会替换key对应的value
2  Map取元素 有两种方法
    方法一:
    通过Map中Set<Map.Entry<K,V>> entrySet()方法  返回此映射中包含的映射关系的 Set 视图   再通过Set得到Map.Entry对象    K getKey()  返回与此项对应的键。 V getValue()  返回与此项对应的值。


    方法二:
    根据KeySet  返回此映射中包含的键的 Set 视图
    再通过   V get(Object key)  返回指定键所映射的值



练习:给定任意字符串,统计该字符串中每个字符出现的次数
String s="abbcccddddeeeee";

public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String str = "abbcccddddeeeee";
		TreeMap<Character,Integer> map = new TreeMap<Character,Integer>();
		for(int i=0;i<str.length();i++){
			if(map.containsKey(str.charAt(i))){
				int b = map.get(str.charAt(i));
				map.put(str.charAt(i), ++b);
			}else{
				map.put(str.charAt(i), 1);
			}
		}
		//通过entrySet得到映射关系映射关系
//		Set<Entry<Character, Integer>> set=map.entrySet();
//		for(Entry<Character, Integer> q:set){
//			System.out.println(q.getKey()+"  "+q.getValue());
//		}
		
		
		//通过keySet包含的键的 Set   再通过键  得到 键所对应值
		Set<Character> t = map.keySet();
		for(char b:t){
			System.out.println(b+" "+map.get(b));
		}
		//迭代器循环取出元素
//      Iterator ter = tree.iterator();
//		
//		while(ter.hasNext()){
//			System.out.println(ter.next());
//		}
		
	}

    










发表评论
用户名: 匿名