如何输出地图的反转[Java]

时间:2016-12-06 05:15:15

标签: java dictionary

问题如下:简有朋友,她与一个号码联系在一起。我必须把最少喜欢的朋友输出到最喜欢的朋友。

我主要的好奇心是如何在输出时反转地图值的顺序。 在我的代码中,我必须通过Iterator(我无法直接使用Collection)提取值,然后通过在索引0处插入每个连续元素将每个String存储到ArrayList中。结果,颠倒了我认为有效的顺序。

import java.util.*;
import java.io.*;
import static java.lang.System.*;

public class Friends {
    public static void main(String args[]) throws IOException
    {
        Scanner line = new Scanner(new File("friends.dat"));
        int trials = line.nextInt();
        for(int k = 0 ; k < trials ; k++)
        {
            TreeMap<Integer, String> m = new TreeMap<Integer,String>();
            int subtrials = line.nextInt();

            for(int a = 0; a < subtrials ; a++)
            {
                String name = line.next();
                int likes = line.nextInt();
                m.put(likes,name);
            }

            Iterator iter = m.values().iterator();       //**Code of interest starts here**
            ArrayList<String> list = new ArrayList<String>();

            while(iter.hasNext()) {

                list.add(0, (String)iter.next());
            }

            for(int a = 0 ; a < list.size() ; a++)
            {
                if(a == list.size() - 1)
                    out.print(list.get(a));
                else
                    out.print(list.get(a) + ", ");
            }
            out.println();
        }
    }
}

4 个答案:

答案 0 :(得分:2)

您可以使用自定义comparator来反转地图中条目的顺序(请注意,这仅适用于TreeMap - 其他地图实施并不关心订购)。

public static void main(String[] args) {
    TreeMap<Integer, String> map = new TreeMap<>((key1, key2) -> Integer.compare(key2, key1)); //Custom comparator.
    map.put(1, "Bob");
    map.put(3, "Baz");
    map.put(2, "Foo");

    System.out.println(map);
}

答案 1 :(得分:1)

使用喜欢的数量作为关键字似乎很奇怪,因为多个朋友可能拥有相同数量的喜欢。

在Java 8中,我将执行以下操作:

Map<String, Integer> map = new HashMap<>();
map.put("Jack", 7);
map.put("Jill", 3);
map.put("John", 12);

map.entrySet()
   .stream()
   .sorted(Map.Entry.comparingByValue((a, b) -> b.compareTo(a)))
   .forEach(System.out::println);

基本上,这会将地图条目转换为流,使用反转自然顺序的比较器按值比较它们,然后打印出每个条目。

结果是:

John=12
Jack=7
Jill=3

答案 2 :(得分:0)

请试试这个:

m.forEach((a,b)->System.out.print(b+", "));

这将为您提供一个有序的地图,从最喜欢的喜欢到喜欢。 如果你想要一个从最喜欢到最少喜欢的有序地图,你可以这样做:

TreeMap<Integer, String> m = new TreeMap<Integer,String>(Collections.reverseOrder());

答案 3 :(得分:-1)

您可以简单地reverse列表。

 list.reverse();

或者,您可以将TreeMap constructor与反向比较器一起使用,以按降序存储地图。

... = new TreeMap<>(Collections.reverseOrder(Integer::compare));