2017-04-10 64 views
1

我的第一篇文章&我只开始学习Java,所以请耐心等待。按值排序HashMap,它是一个具有多个变量的类的实例

我有一个HashMap,它存储一个类的键和一个实例作为对应的值(来自我称为Main的类)。该对象有两个变量。我想要做的是根据特定的对象变量获得一个打印输出,在这个例子中每年。这里是我的代码:

public class Main { 

    private String name; 
    private int year; 

    public Main(String name, int year) { 
     this.name = name; 
     this.year = year; 
    } 

protected static Map<Integer, Main> input = new LinkedHashMap<Integer, Main>(); 

input.put(1, new Main("Chris", 1980); 
input.put(2, new Main("Daphne", 1981); 
input.put(3, new Main("Sandra", 1976); 
input.put(4, new Main("Adele", 1980); 

所以现在我想要做的是按年份列出每个人。所以,我的期望输出应该是这样的:

1976: Sandra 
1980: Chris, Adele 
1981: Daphne 

非常感谢

做到这一点是使用流,例如
+0

你需要写一个排序功能。这:[堆栈溢出问题](http://stackoverflow.com/questions/780541/how-to-sort-a-hashmap-in-java)可能会有所帮助。 –

+0

你有两种选择。使用for循环,或使用流。你将能够找到很多例子,如果你谷歌“流hashmap组由”, –

+0

感谢@NickZiebert,你能告诉我我将如何使用循环? –

回答

0

使用流,你可以这样做:

public class Main { 
private String name; 
private int year; 

public Main(String name, int year) { 
    this.name = name; 
    this.year = year; 
} 

public String getName() { 
    return name; 
} 

public int getYear() { 
    return year; 
} 

public static void main(String[] args) { 
    Map<Integer, Main> input = new LinkedHashMap<>(); 

    input.put(1, new Main("Chris", 1980)); 
    input.put(2, new Main("Daphne", 1981)); 
    input.put(3, new Main("Sandra", 1976)); 
    input.put(4, new Main("Adele", 1980)); 

    input.entrySet().stream().map(Map.Entry::getValue) 
      .collect(Collectors.groupingBy(Main::getYear)) 
      .forEach((key, value) -> System.out.println(
        key + ": " + String.join(", ", value.stream().map(Main::getName) 
          .collect(Collectors.toList())))); 
} 
} 
+0

是的,这让我想要什么。谢谢@syonekura –

2

方式一:

Map<Integer,List<Main>> mainByYear = input.values().stream().collect(Collectors.groupingBy 
    (e -> e.year)); 

然后你就可以通过mainByYear迭代地图打印出关键字和关联的列表成员。

相关问题