栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java set 和 map 学习记录

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java set 和 map 学习记录

set (和js中的set性质一致)

hashSet (就是普通set)

需要掌握的api

         Arrays.asList("a","b","c");  将普通数组转换成 ArrayList 集合

去重

        String[] arr = new String[] {"i", "think", "i", "am", "the", "best"};
        LinkedHashSet noDups = new LinkedHashSet(Arrays.asList(arr));
        System.out.println("(LinkedHashSet) distinct words:    " + noDups);

treeSet

        TreeSet是SortedSet接口的实现,元素不论以什么元素插入,在遍历的时候,都会以天然顺序遍历。

        三种排序方法 

    //01
public static void main(String[] args) {
//      test1();
 test2();
}

private static void test1() {
 TreeSet treeSet=new TreeSet();
 treeSet.add("a");
 treeSet.add("d");
 treeSet.add("b");
 treeSet.add("e");
 treeSet.add("c");

 for (String string : treeSet) {
 System.out.println(string);
 }
}


    //02
private static void test2() {
 TreeSet infosSet =new TreeSet(new Comparator() { // 传入比较器,保证顺序

 @Override
 public int compare(Info o1, Info o2) {
 int num=o1.getId()-o2.getId();
 num = num==0?o1.hashCode()-o2.hashCode():num;
 return num;
 }
 }) ;

 infosSet.add(new Info(0, "qqq"));
 infosSet.add(new Info(1, "wew"));
 infosSet.add(new Info(3, "ete"));
 infosSet.add(new Info(2, "bjk"));
 infosSet.add(new Info(1, "wew")); // 重复元素,compare方法返回0,不会被插入到TreeSet

 for (Info info : infosSet) {
 System.out.println(info);
 }
}



    //03
public class Test {
 public static void main(String[] args) {
 TreeSet set = new TreeSet(new PersonComparator());
 set.add(new Person("lwc", 80));
 set.add(new Person("nxj", 70));
 set.add(new Person("lp", 60));
 set.add(new Person("fy", 75));
 Iterator ite = set.iterator();
 while (ite.hasNext()) {
 Person p = (Person)ite.next();
 System.out.println(p.name);
 }
 }
}
class Person {
 String name;
 int score;

 public Person(String name, int score) {
 this.name = name;
 this.score = score;
 }
}
class PersonComparator implements Comparator {
 public int compare(Object o1, Object o2) {
 Person p1 = (Person) o1;
 Person p2 = (Person) o2;
 return p1.score - p2.score;
 }
}
Map  和js差不多 

         在该图中1-4步骤是找到该元素在数组中位置,5-8步骤是将该元素插入数组中。在插入的过程中会遇到一点点小挫折。在众多肯能存在多个元素他们的hash值是一样的,这样就会得到相同的索引位置,也就说多个元素会映射到相同的位置,这个过程我们称之为“冲突”。解决冲突的办法就是在索引位置处插入一个链接列表,并简单地将元素添加到此链接列表。当然也不是简单的插入,在HashMap中的处理过程如下:获取索引位置的链表,如果该链表为null,则将该元素直接插入,否则通过比较是否存在与该key相同的key,若存在则覆盖原来key的value并返回旧值,否则将该元素保存在链头(最先保存的元素放在链尾)。

        1. Map 是一个键值对(key-value)映射接口。Map映射中不能包含重复的键;每个键最多只能映射到一个值。
        2. Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
        3. Map 映射顺序。有些实现类,可以明确保证其顺序,如 TreeMap;另一些映射实现则不保证顺序,如 HashMap 类。
        4. Map 的实现类应该提供2个“标准的”构造方法:第一个,void(无参数)构造方法,用于创建空映射;第二个,带有单个 Map 类型参数的构造方法,用于创建一个与其参数具有相同键-值映射关系的新映射。实际上,后一个构造方法允许用户复制任意映射,生成所需类的一个等价映射。尽管无法强制执行此建议(因为接口不能包含构造方法),但是 JDK 中所有通用的映射实现都遵从它。

public class MapDemo   
{  
    public static void main(String[] args)  
    {  
        Map m = new HashMap();  
          
        m.put("zhangsan", 19);  
        m.put("lisi", 49);
        m.put("wangwu", 19);  
        m.put("lisi",20);  
        m.put("hanmeimei", null);         
        System.out.println(m);  
          
        System.out.println(m.remove("wangwu"));  
          
        m.clear();  
        System.out.println(m);        
    }  
}

map的遍历

       通过map 自带的.keySet() 对键进行遍历 ,遍历过程中也可以通过map.get(key) 对value进行遍历。

  map.entrySet()  //获取map中的所有键值对。

  while(it.hasNext()){
            Map.Entry next = ( Map.Entry) it.next();

}

    //通过迭代器 
  Map map = new HashMap();
        map.put("王伟琪",23);
        map.put("上坂堇",30);
        map.put("丰田露娜",18);
        Iterator it = map.entrySet().iterator();
        while(it.hasNext()){
            Map.Entry next = ( Map.Entry) it.next();
            System.out.println(next.getKey());
   }


  Iterator it = map.keySet().iterator();
        while(it.hasNext()){
            String key = it.next().toString();
            System.out.println(key);
            System.out.println(map.get(key));  //value
        }

TreeMap

根据key进行降序排列 

Map map = new TreeMap(new Comparator(){ 
   public int compare(String obj1,String obj2){ 
    //降序排序 
    return obj2.compareTo(obj1); 
   } 
}); 
map.put("month", "The month"); 
map.put("bread", "The bread"); 
map.put("attack", "The attack"); 
Set keySet = map.keySet(); 
Iterator iter = keySet.iterator(); 
while(iter.hasNext()){ 
    String key = iter.next(); 
    System.out.println(key+":"+map.get(key)); 
}

根据value进行降序排列 

List> mappingList = null; 
Map map = new TreeMap(); 
map.put("aaaa", "month"); 
map.put("bbbb", "bread"); 
map.put("ccccc", "attack"); 
//通过ArrayList构造函数把map.entrySet()转换成list 
mappingList = new ArrayList>(map.entrySet()); 
//通过比较器实现比较排序 
Collections.sort(mappingList, new Comparator>(){ 
  public int compare(Map.Entry mapping1,Map.Entry mapping2){  
      return mapping1.getValue().compareTo(mapping2.getValue()); 
  }
});
for(Map.Entry mapping:mappingList){  
    System.out.println(mapping.getKey()+":"+mapping.getValue()); 
}

HashTable

api与 HashMap一致但是两者不同·我们从他们的定义就可以看出,HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。
第二:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。

排序

Hashtable ht = new Hashtable();
ht.Add("dd", "value2");
ht.Add("cc", "value3");
ht.Add("bb", "value4");
ht.Add("aa", "value5");
ArrayList list = new ArrayList(ht.Keys);
list.Sort();
foreach (string str in list)
{  Console.WriteLine(str+":"+ht[str]);
}
Hashtable h = new Hashtable();
h.put("6", "666");
h.put("8", "888");
h.put("2", "222");
for (String key : h.keySet())
 System.out.println(key);

 
List v = new ArrayList(h.keySet());
Collections.sort(v, new Comparator() {
 public int compare(Object arg0, Object arg1) {
 return Integer.valueOf(arg0.toString()) - Integer.valueOf(arg1.toString());    // 升序,参数顺序对调时降序
  } }); for (String key : v) System.out.println(key + " " + h.get(key) );

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号