基于内部的排序哈希图



尝试按降序对列表进行排序,所以时间最长。这是我的方法,我使用了这里的几页来使其正确,但是我的代码中的某些内容是错误的,它返回了不太正确的列表。

public static ArrayList<String> winnerIs(List<HP> hp){
        //System.out.println("1");
        int size = hp.size();
        //System.out.println(size);
        ArrayList<HP> listofWinner = new ArrayList<HP>();
        Map<String, Integer> map = new HashMap<String, Integer>();
        for(int i = 0; i < size; i++){
            listofWinner.add(hp.get(i));
            map.put(hp.get(i).getName(), hp.get(i).TD1());
            //System.out.println(hp.get(i).getName()+" "+hp.get(i).TD1());
        }
        //sort based on time
        ArrayList<String> keys = new ArrayList<String>(map.keySet());
        //System.out.println("---------------");
        /*for(int i = 0; i < keys.size(); i++){ 
            //wn.add(keys.get(i));
            System.out.println("here "+keys.get(i));
        }*/
        //System.out.println("---------------");

        ArrayList<String> wn = new ArrayList<String>();
        //System.out.println("---------------");
        for(int i = keys.size()-1; i >= 0; i--){    
            wn.add(keys.get(i));
        }
        return wn;
    }

以下是它所反映的内容:

[team2, team1, team4, team3]

但它应该是这样的:

[team4, team3, team2, team1]
时间

是否相等并不重要,我们只需要更好的时间,我不确定代码的哪一部分是错误的。

即使我使用这个

ArrayList<Integer> s = new ArrayList<Integer>(map.values());
        Collections.sort(keys);
        //System.out.println("---------------");
        for(int i = 0; i < s.size(); i++){  
            //wn.add(keys.get(i));
            System.out.println("here "+s.get(i));
        }

结果仍然不正确,这是它返回的内容:

here 2
here 9
here 0
here 0

所以我在stackoverflouw中使用了其中一个页面,我找到了这个解决方案:

public static ArrayList<String> winnerIs(List<HumanPlayer> hp){
        //System.out.println("1");
        int size = hp.size();
        //System.out.println(size);
        ArrayList<HumanPlayer> listofWinner = new ArrayList<HumanPlayer>();
        Map<String, Integer> map = new HashMap<String, Integer>();
        for(int i = 0; i < size; i++){
            listofWinner.add(hp.get(i));
            map.put(hp.get(i).getName(), hp.get(i).getTimeDriver1());
            //System.out.println(hp.get(i).getName()+" "+hp.get(i).getTimeDriver1());
        }
        map.entrySet().stream()
        .sorted(Map.Entry.<String, Integer>comparingByValue().reversed()) 
        .limit(1000) 
        .forEach(System.out::println);
        return null;
    }

这将返回正确的列表,但我不确定这是什么:.limit(1000)以及如何将其等同于列表,以便我可以返回它。

您可以使用 Java 8 按映射值进行很好的排序:

Map<String, Integer> sorted = /* your map */.entrySet().stream()
        .sorted(Entry.comparingByValue()) //comparator for value, can reverse or use other
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue,
                (e1, e2) -> { throw new IllegalArgumentException("Duplicate Key: " + e1.getKey()); },
                LinkedHashMap::new));

我选择为重复键(合并函数,Collectors#toMap的第 3 个参数)抛出异常,但您也可以只返回找到的第一个键:

.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));

要记住的是各个地图所坚持的合同。 HashMap是一个未排序的映射,不会保证迭代顺序(所以排序将是一个徒劳的努力),而TreeMap是一个SortedMap,但这在合同上意味着它是按键而不是值排序的。LinkedHashMap将保留迭代顺序,通常基于插入(很像List),因此当您需要排序地图输出时,通常是您想要的。

假设 HP 类中的 TD1() 方法是您要排序的值,并且您确实希望使用 Map 来帮助您排序。 我想你想要这样的东西

Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
for (HP h : hp) {
    if (map.get(h.TD1() != null) {
        map.get(h.TD1()).add(h.getName());
    }
    else {
      List temp = new ArrayList<String>();
      temp.add(h.getName());
      map.put(h.TD1(), temp);
    }
}
ArrayList keys = Arrays.asList(map.getKeyset().toArray());
Collections.sort(keys);
for ( int i = keys.length() - 1; i >= 0; i--) {
    List<String> names = map.get(i);
    // print names
}

看看这个伪代码,我相信你会对这个有整体的想法。

Map<Integer,List<String> map = new HashMap<Integer,List<String>>();
for(HP hpObject:hp) {
 if(map.containsKey(hpObject.TD1())) {
    map.get(hpObject.TD1()).add(hpObject.getName());
 } else {
    List<String> names = new ArrayList<String>();
    names.add(hpObject.getName());
    map.put(hpObject.TD1(),names);
 }
}
    // To sort by keys
    TreeMap sortedByTD = new TreeMap(map);
    // Iterate over TreeMap and create the list of winners you need
    return result;enter code here

最新更新