数据开发_Python中字典和Java映射总结

开发语言

通过对比不同开发语言的特性,了解各个语言的特质以及共通之处,有效和适当的采用相应的开发语言和开发技巧

Python

基本内容: 键不可重复且必须是可hash的 凡是可变对象都不可以做字典的key
 1.定义  dict()  或者 {}
 2. keys values() items()
 3. []  get   字典的pop方法  
  新的索引键并为其赋值,可以将项目添加到字典中。一对中括号紧跟在字典后面,中括号里写key,等号右侧写value
    pop() 方法删除具有指定键名的项: popitem() 方法删除最后插入的项目(在 3.7 之前的版本中,删除随机项目)
     # 两个输入参数式当key不存在时,pop方法会返回这个默认值,如果是只有一个输入参数则当key不存在时,程序会报错
       print(student.pop('score', 50))
    clear() 关键字清空字典:
   setdefault()	返回指定键的值。如果该键不存在,则插入具有指定值的键。
   update()	使用指定的键值对字典进行更新
 def statis_col_2(a):
    d = dict()
    for sig in a:
        d[sig] = d.get(sig, 0)+1
    print(d)
    return d
 4.初始化 for sigle_example in dict_example:   以及 multidict 和赋初值
 想要一个键映射多个值,将这多个值放到另外的容器中, 比如列表或者集合里面
       d = {'a': [1, 2, 3]}
       # 列表和元组的组合
       pairs = [("a", 'Spring'), (1, 'Summer'), (1, 'Fall'), (3, 'Winter')]
       for key, value in pairs:
           if key not in d:
               d[key] = []
           d[key].append(value)
       print(d)
     另外的写法
       pairs = [("a", 'Spring'), (1, 'Summer'), (1, 'Fall'), (3, 'Winter')]
       f_dict = dict()
       for key_cd, value_cd in pairs:
           data = f_dict.get(key_cd)
           if data is None:
               f_dict[key_cd] = []
           f_dict[key_cd].append(value_cd)
       print("$##########",f_dict)
 5.内置函数: 
   len() 
   del score_dict['示例']  del 关键字删除具有指定键名的项目: del 关键字也可以完全删除字典:
   in 或者not in 成员操作符
   内建函数 next(iterator)
 6 迭代器  Python里的迭代器并没有提供类似has_next()  Python的做法有一些利用异常进行流程控制的嫌疑
   Python专门将关键字for用作了迭代器的语法糖
  s = {'one':1,'two':2,'three':3}
      m = iter(s)
      while True:
          try:
              print (next(m))
          except StopIteration:
            print("##")
            break  
	 内置了一个模块itertools
   7.顺序
   python中字典的各项的顺序是随机的
   collections 模块中的 OrderedDict 类。 在迭代操作的时候它会保持元素被插入时的顺序
   使用 zip() 和 sorted() 函数来排列字典数据 rices_sorted = sorted(zip(prices.values(), prices.keys())) 注意: zip() 函数创建的是一个只能访问一次的迭代器

Java

1.定义: HashMap TreeMap LinkedHashMap
2. keySet  values  entrySet
3. put get remove   size
   getOrDefault Map集合中有这个key时,就使用这个key值,如果没有就使用默认值defaultValue
4.遍历 
   01.for循环的形式
     for (Entry<String, String> entry : map.entrySet()) {}
   02.Iterator 迭代器的形式
       Iterator iter = map.entrySet().iterator();
       while (iter.hasNext()) {
       Map.Entry entry = (Map.Entry) iter.next();
          Object key = entry.getKey(); }
5. 初始化
   import java.util.*;
   public class TraversalInit {
       public static void main(String [] args) { 
           //创建List 对象
           List<String> arrayList = new ArrayList<String>();
           arrayList.add("aaa");
           arrayList.add("ccc");
           arrayList.add("fff");
           //01.创建Map对象
           Map<String, String> systemNote = new HashMap<>();
           //1.创建Map对象
           Map<String, String> TestMap  = new HashMap<>();
           if (arrayList != null && !arrayList.isEmpty()) {
               for (String row : arrayList) {
                   // 02. 使用get获取数据然后判断是否是null值
                   // get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,
                   // 另一种是该键对象没有映射任何值对象,即值对象为null
                   String dataNote = systemNote.get(row);
                   if (dataNote == null) {
                       dataNote = "aaaa";
                       // 03. null值情况下,添加数据
                       systemNote.put(row, dataNote);
                   }
                 // 2. 使用 containsKey 判断是否是包含
                   if (!TestMap.containsKey(row)) {
                       // 3. 不在内的情况下,添加数据
                       TestMap.put(row, "bcdfg");
                   }
                   //04.循环结束,初始化完成
               }
           }
           // 遍历的两种方式 1.for循环的形式
           for (Map.Entry<String, String> entry : systemNote.entrySet()) {
               System.out.println(entry.getKey()+": " +entry.getValue());
           }
           // 遍历的两种方式 2.迭代器的形式
           Iterator iter = TestMap.entrySet().iterator();
           while (iter.hasNext()) {
               Map.Entry entry = (Map.Entry) iter.next();
               System.out.println(entry.getKey()+"## " +entry.getValue());
           } } } 
6.注意: java的HashMap的key为对象 key是自定义类,要重写对象的两个方法 Map<String, Instance>   
 顺序:
     HashMap        没有顺序-随机
     TreeMap        Key的 自然顺序
     LinkedHashMap  Key的 插入顺序迭代
 Key值和Value值
    HashMap        key和value都允许为空 key可以有一个键为null, value可以有无数个值为null
	LinkedHashMap  key和value都允许为空
	TreeMap        key不可以为NULL, Value可以为NULL
    ConcurrentHashMap  key和value键和值 不能 有null
 HashMap就是通过对象的= hashCode() 和 equals 判定是否为同一个key,重写这两个方法
   
 7.源码以及
  java.util.Iterator;    
  package java.util;  
  public interface Iterator<E> {  
      boolean hasNext();  
      E next();  
      void remove();   }    
重写 equals() 和 hashCode()
  01.重写 equals()
   默认的equals()实际是判断两个引用是否指向内在中的同一个对象,相当于 == . 
      重写时要遵循以下三步:
    1. 判断是否等于自身.
    if(other == this)return true;
    2. 使用instanceof运算符判断 other 是否为Coder类型的对象.
    if(!(other instanceof Coder))return false;
    3. 比较Coder类中你自定义的数据域,name和age,一个都不能少.
    Coder o = (Coder)other; return o.name.equals(name) && o.age == age;
  02.重写hashcode()
   要保证Coder对象中所有的成员都能在hashCode中得到体现
         result = result * 31 + name.hashCode();
 		result = result * 31 + age;
	    return result;
 HashMap  默认值 capacity 16    load Factory 0.75   threshold = loadFactor * capacity。
       元素个数(size)超过临界值(threshold)时就会自动扩容

参考

参考<Cookbook>
原文地址:https://www.cnblogs.com/ytwang/p/13919482.html