数组是具有相同的数据类型且按一定次序排列的一组变量的集合体
一维数组:连续内存的,线性的,有下标的,长度固定的
动态数组: 连续内存的,线性的,有下标的 ,长度可变的
说到动态数组 那么不如自己定义一个
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()); // } }