代码之家  ›  专栏  ›  技术社区  ›  D. Müller

生成唯一键以避免在树映射中覆盖

  •  2
  • D. Müller  · 技术社区  · 7 年前

    我有一个 TreeMap<Long, String> 包含的元组 <FileSize, FileName> 因为我需要按文件大小排序。订购工作完美。

    Map ,将用此新文件名覆盖旧条目。

    TreeMap 键,通过更改 树图 TreeMap<String, String> <fileSize#counter, fileName> . 然后问题是键的顺序,因为 String 例如 9#1 89#1 90#1 这是错误的,因为 fileSize 只有9(因此应该在89和90之前出现)!

    然后我写了一个习惯 Comparator 它可以按 文件大小 文件大小 #counter 值)。

    这是我的代码:

    TreeMap<String, String> fileNamesAndSizes = new TreeMap<String, String>(new Comparator<String>() {
        public int compare(String o1, String o2) {
            Long key1 = Long.valueOf(o1.split("#")[0]);
            Long key2 = Long.valueOf(o2.split("#")[0]);
    
            return key1.compareTo(key2);
        }
    });
    

    如何在我的 树图 文件大小

    非常感谢。

    5 回复  |  直到 7 年前
        1
  •  4
  •   Rathan Naik    7 年前

    TreeMap<String, List<String>> map; // like <FileSize, List<FileName>>
    

    文件名 具有相同的

        2
  •  3
  •   nafas    7 年前

    TreeMap<Long, Set<String>> map; //Long file Size, Set <-- file name(s)
    

    现在添加一个新文件:

    if(!map.contains(key)){  //key the size of the file
     Set<String> set = new HashSet<String>();
     map.put(key,set);
    }
    map.get(key).add(set);
    

    要检索,需要遍历每个值条目:

    for(Map<Long,Set<String>> entry  : map.entrySet()){
    
       for(String s : entry.getValue()){
        System.out.println(entry.getKey() + " : " + s);
       }
    }
    
        3
  •  0
  •   Joop Eggen    7 年前

    • file name 应该是唯一键( Map<String, Long>
    • (file name, file size) Set<Pair<String, Long>> ).

    文件名

    SortedMap<String, Long> fileNamesAndSizes = new TreeMap<>();
    

    元组(文件名、文件大小)

    class FileInfo implements Comparable<FileInfo> {
        public final String name;
        public final long size;
        public FileInfo(String name, long size) {
            this.name = name;
            this.size = size;
        }
        @Override
        public int compareTo(FileInfo other) {
            ...
        }
    }
    OrderedSet<FileInfo> fileNamesAndSizes = new TreeSet<>();
    
        4
  •  0
  •   Klitos Kyriacou    7 年前

        public int compare(String o1, String o2) {
            String[] o1parts = o1.split("#");
            String[] o2parts = o2.split("#");
            long key1 = Long.parseLong(o1parts[0]);
            long key2 = Long.parseLong(o2parts[0]);
            int cmp = Long.compare(key1, key2);
            if (cmp != 0)
                return cmp;
    
            return Long.compare(Long.parseLong(o1parts[1]), Long.parseLong(o2parts[1]));
        }
    

    存在各种更好的替代方案:

    1. 首先创建填充为零的字符串,然后使用字符串的自然顺序,而不是自定义比较器
    2. 不要使用字符串,而是使用包含两个长度的类,一个是大小,另一个是唯一的数字,或者使用包含大小和名称的类,并使用这两个字段适当地编写比较器
    3. 使用多集(例如,来自Guava或Apache)
    4. 使用 TreeSet<Long, Set<String>>
        5
  •  0
  •   Raju Sharma    7 年前
     static int i = 1 ;
        TreeMap<String, String> fileNamesAndSizes = new TreeMap<String, String>(new Comparator<String>() {
        public int compare(String o1, String o2) {
            Long key1 = Long.valueOf(o1.split("#")[i]);
            i += 1;
            // somthing like this 
            return key1.compareTo(key2);
        }
    });