现在的位置: 首页 > 综合 > 正文

第十五天:集合二

2018年05月17日 ⁄ 综合 ⁄ 共 3253字 ⁄ 字号 评论关闭

Collection有两个接口了它List和Set。
List接口中有两个实现类ArrayList和LinkedList
Set中用的并不多,它的一个实现类为HashSet,用散列表实现。

散列查找比顺序查找更加快!

Map接口是一个映射。

Object[] temp = new Object[length];
System.arraycopy(data,0,temp,0,data.length);
data = temp;

上面三句话等于下面一句话。数组扩展的方法。非常重要!

//表示把data数组的length个元素的数组copy到data数组中。
data = Arrays.copyOf(data,length);

 多年的疑惑在这里要被解决:
Collection接口里面有一个方法iterator(),这个方法会返回返回在此 collection 
的元素上进行迭代的迭代器Iterator<E>,所以凡是实现了Collection接口的所有类
都会有这个方法。并且返回那个迭代器。

超级经典的迭代:
while(ite.hasNext()){//游标最初在第一个元素之前,hasNext()表示有没有下一个,如果有返回true;
      String e = (String)ite.next();//执行next()方法会把游标指向一个元素,并且返回下一个元素。
      System.out.println(e);
      sum++;
    }
能够控制游标移动的方法是next(),而hasNext()只是检测有没有下一个,如果有再移动,这就是它们与while或者for
循环的完美配合。

//shuffle这个是打乱的意思,以前的又白写了,哈哈。Collections是工具包中的类。是一个工具类。
Collections.shuffle(cards);

//随机分配给某个人,因为我们知道这是一个周期数列。
  players[idx++%players.length].add(card);
取余是一个周期数列,十分重要。例如第二个%后面的数字是7,那么就是1-6的一个周期数列 。
idx++%players.length  十分好的一个周期数列。

面向对象的思维:
   就想成一个对象,现实中怎么做,java中也怎么做,一个player里面有什么,java中也有什么。它有什么,就是指自己有
   什么样的成员变量,一个对象拥有的东西就是它的成员变量,一个人能够干什么就是它有什么样的方法。
以自然中朴素逻辑去思考。

CountCharDemo.java十分重要。必须要参看代码一下。

public class CountCharDemo {

/**
* @param args
*/
public static void main(String[] args) {
Map<Character,Integer> map = countChar("aabcdeeedaaa");
System.out.println("toString():"+map.toString());
//map的迭代一迭代的也是每一个条目,与迭代二相同,只是一个while,一个for.
for (Map.Entry<Character, Integer> maps : map.entrySet()) {
System.out.println(maps.getKey()+":"+maps.getValue());

}
//map的迭代二
/**
* entrySet()返回条目的集合,一条一条的map映射是一个条目,返回是一个Set类型
* 所以它是不重复无序的。set里面的泛型是Map.Entry.
* 迭代的是每个条目。
*/
Set<Map.Entry<Character,Integer>> set = (Set)map.entrySet();
Iterator iterator = set.iterator();
System.out.println("--------------------------");
System.out.println("|字符|数量|");
while (iterator.hasNext()) {
Map.Entry<Character, Integer> entry = (Map.Entry<Character, Integer>) iterator.next();
System.out.print("| "+entry.getKey()+" | ");
System.out.println(entry.getValue()+" |");
}
//MAP的迭代 三  通过键值进行迭代 ,因为键值本身不重复。再通过值迭代value.
Set<Character> set2 = map.keySet();
Iterator iterator2 = set2.iterator();
while (iterator2.hasNext()) {
char c = (Character)iterator2.next();
int val = map.get(c);
System.out.print("字符:" + c);
   System.out.println("数:" + val);
}

}

public static Map<Character, Integer> countChar(String string){
Map<Character,Integer> map = new HashMap<Character, Integer>();
for (int i = 0; i < string.length(); i++) {
//扫描字符串中的每个字符
char c = string.charAt(i);
if(map.containsKey(c)){//检查 c 是否被统计过
//根据键值得到value值。
int val = map.get(c);//取出原先的统计结果并加一,这里有一个自动拆包的过程
val++;
map.put(c, val);//将新结果送回map
}else { //c没有被统计过, 为map增加新纪录:"c:1"
map.put(c, 1);
}
}


return map;
}

}

集合的迭代(遍历)(模仿了数鸡蛋的方式)
  1 java 接口 Iterator(迭代器) 描述了逐一遍历的
  方法.
  2 Iterator 描述了一个顺序结构, 并且有一个游标
   概念, 游标默认在第一个元素之前. 调用方法 
   hasNext() 可以检查游标是否有下一个元素.
   使用next() 方法移动游标,并且返回当前游标指向的
   元素. 这两个方法经常与while循环组成模式化
   结构, 用来遍历集合内容. 是常见的标准结构.
  3 凡是对集合的遍历都应采用Iterator接口实现.
  编程中十分常见.
  4 集合在迭代期间不能调用集合的更新方法 add()
  remove set 等
  5 如果需要迭代时候删除集合内容, 可以调用迭代器的
  删除方法 ite.remove() 删除当前元素.不能直接在用集合删除 。

  User u = userMap.get(name);
if(u!=null){
throw new UserExistException("已经注册过了!");
}
//如果上面抛出了异常就不可能执行下面的代码 因为软件已经出错了。
User user=new User();
user.setId(idx++);
user.setEmail(email);
user.setName(name);
user.setPwd(pwd);
userMap.put(name, user);

/**
只需要记住一句话,如果运行到有异常,软件就会停止。抛出异常。
如果我们用try catch把异常给捕获了,然后在catch语句块里面写上相应的东西,
它就不会抛出异常,而是会去执行语句块里面的东西,
例如:jobsys中,在插入数据所时间,如果检测到已经存在这个用户,肯定会抛出异常,
那么如果捕获到这个异常,则会执行catch语句块里面的东西,那么我们把catch语句块里面的
东西写成update不就行了吗?
厉害 吧。
*/

  
  
  
  
  

抱歉!评论已关闭.