美文网首页
leetcode609

leetcode609

作者: HannahLi_9f1c | 来源:发表于2019-04-03 22:34 被阅读0次
  1. 第一次因为遍历出错
class Solution {
    public List<List<String>> findDuplicate(String[] paths) {
        Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
        for(int i=0; i<paths.length; i++){
            String files = paths[i];
            String[] tmp = files.split(" ");
            String dir = tmp[0];
            for(int j=1; j<tmp.length ;j++){
                StringBuilder str = new StringBuilder(dir);
                str.append('/');
                int h=0;
                while(h<tmp[j].length() && tmp[j].charAt(h)!='('){
                    str.append(tmp[j].charAt(h));
                    h++;
                }
                h++;
                StringBuilder fileContent = new StringBuilder();
                while(h<tmp[j].length() && tmp[j].charAt(h)!=')'){
                   fileContent.append(tmp[j].charAt(h));
                    h++;
                }
                if(!map.containsKey(fileContent.toString())){
                     ArrayList<String> listDir = new ArrayList<String>();
                   // System.out.println(str.toString());
                    listDir.add(str.toString());
                    map.put(fileContent.toString(),listDir);
                } else{
                    ArrayList<String> listDir= map.get(fileContent.toString());
                    listDir.add(str.toString());
                    map.put(fileContent.toString(),listDir);
                    
                }
                
            }
        }
        List<List<String>> result = new ArrayList<List<String>>();
        for(int i=0; i<map.size(); i++){
            ArrayList<String> str = new ArrayList<String>();
            for(int h=0; h<map.get(i).size(); h++)
                System.out.println(map.get(i).get(h));
            result.add(map.get(i));
        }       
        return result;
        
    }
}

这样方式遍历get(i)是Null,原因当然是API里面没有get(i),只有get(Object o).

  1. for( : )对map的values遍历
class Solution {
    public List<List<String>> findDuplicate(String[] paths) {
        Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
        for(int i=0; i<paths.length; i++){
            String files = paths[i];
            String[] tmp = files.split(" ");
            String dir = tmp[0];
            for(int j=1; j<tmp.length ;j++){
                StringBuilder str = new StringBuilder(dir);
                str.append('/');
                int h=0;
                while(h<tmp[j].length() && tmp[j].charAt(h)!='('){
                    str.append(tmp[j].charAt(h));
                    h++;
                }
                h++;
                StringBuilder fileContent = new StringBuilder();
                while(h<tmp[j].length() && tmp[j].charAt(h)!=')'){
                   fileContent.append(tmp[j].charAt(h));
                    h++;
                }
                if(!map.containsKey(fileContent.toString())){
                     ArrayList<String> listDir = new ArrayList<String>();
                   // System.out.println(str.toString());
                    listDir.add(str.toString());
                    map.put(fileContent.toString(),listDir);
                } else{
                    ArrayList<String> listDir= map.get(fileContent.toString());
                    listDir.add(str.toString());
                    map.put(fileContent.toString(),listDir);
                    
                }
                
            }
        }
        List<List<String>> result = new ArrayList<List<String>>();
          for(List<String> s: map.values()) {
            if(s.size() > 1) {
                result.add(s);
            }
        }
        return result;
        
        
    }
}
  1. 看到一个博主用getOrDefault写的很简洁。
class Solution {
    public List<List<String>> findDuplicate(String[] paths) {
        Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
        for(int i=0; i<paths.length; i++){
            String files = paths[i];
            String[] tmp = files.split(" ");
            String dir = tmp[0];
            for(int j=1; j<tmp.length ;j++){
                StringBuilder str = new StringBuilder(dir);
                str.append('/');
                int h=0;
                while(h<tmp[j].length() && tmp[j].charAt(h)!='('){
                    str.append(tmp[j].charAt(h));
                    h++;
                }
                h++;
                StringBuilder fileContent = new StringBuilder();
                while(h<tmp[j].length() && tmp[j].charAt(h)!=')'){
                   fileContent.append(tmp[j].charAt(h));
                    h++;
                }
                   System.out.println(fileContent);   
               ArrayList<String> newContent =  (ArrayList<String>) map.getOrDefault(fileContent.toString(), new ArrayList<String>());
                 newContent.add(str.toString());
                map.put(fileContent.toString(),newContent);              
            }
        }
       
        List<List<String>> result = new ArrayList<List<String>>();
          for(List<String> s: map.values()) {
            if(s.size() > 1) {
                result.add(s);
            }
        }
        return result;
        
    }
}
  1. map的遍历方式
  • 获得key-value的Set集合
 Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
// 然后用for循环遍历
        for(Map.Entry<String, Integer> entry : entrySet){
            System.out.print(entry.getKey());
            System.out.println(entry.getValue());
        }

//也可以用迭代器遍历
 Iterator iter = entrySet.iterator();
        while (iter.hasNext()) {
            // 遍历时,需先获取entry,再分别获取key、value
            Map.Entry entry = (Map.Entry) iter.next();
            System.out.print((String) entry.getKey());
            System.out.println((Integer) entry.getValue());
        }

  • 获得key的Set集合 再遍历
        Set<String> keySet = map.keySet();
        //  通过for循环
        for(String key : keySet){
            System.out.print(key);
            System.out.println(map.get(key));
        }
        // 通过迭代器:先获得key的Iterator,再循环遍历
        Iterator iter2 = keySet.iterator();
        String key = null;
        while (iter2.hasNext()) {
            key = (String)iter2.next();
            System.out.print(key);
            System.out.println(map.get(key));
        }
  • 获得value的Set集合 再遍历
        Collection valueSet = map.values();
        Iterator iter3 = valueSet.iterator();
        while (iter3.hasNext()) {
            System.out.println(iter3.next());
        }

相关文章

  • leetcode609

    第一次因为遍历出错 这样方式遍历get(i)是Null,原因当然是API里面没有get(i),只有get(Obje...

网友评论

      本文标题:leetcode609

      本文链接:https://www.haomeiwen.com/subject/qqotiqtx.html