【发布时间】:2018-09-08 12:56:16
【问题描述】:
我正在尝试根据对象变量的值过滤 Java 对象的 ArrayList。
如果这听起来令人困惑,我很抱歉。也许代码会更好地解释它。
public static void main(String[] args)
{
ArrayList<Data> list = new ArrayList<>();
list.add(new Data("Uvumvew", 10));
list.add(new Data("Uvumvew", 10));
list.add(new Data("Uvumvew", 10));
list.add(new Data("Uvumvew", 11));
list.add(new Data("Uvumvew", 14));
list.add(new Data("Uvumvew", 14));
list.add(new Data("Ossas", 5));
list.add(new Data("Ossas", 5));
list.add(new Data("Ossas", 10));
list.add(new Data("Ossas", 10));
list.add(new Data("Ossas", 10));
list.add(new Data("Dummy", 7));
list.add(new Data("Dummy", 7));
list.add(new Data("Dummy", 7));
list.add(new Data("Dummy", 8));
list.add(new Data("Dummy", 8));
}
和对象
private String name;
private double value;
public Data() {
}
public Data(String name, double value) {
super();
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
如您所见,arraylist 中会有重复项。我只能在它成为数组列表后对其进行过滤,因为我正在读取文件然后将其放入 ArrayList。
我试图实现的输出如下所示
Uvumvew,10
Ossas,10
Dummy,7
因为 10、10、7 分别是 Uvumvew、Ossas 和 Dummy 最常见的值。我曾尝试使用 Collection 并过滤值,但由于对象之间包含重复值,因此这是不可能的。
我的尝试是这样的
Collection<Data> nonDuplicatedName = list.stream()
.<Map<String, Data>> collect(HashMap::new,(m,e)->m.put(e.getName(), e), Map::putAll)
.values();
它会产生这样的输出,这是错误的
Dummy 8.0
Uvumvew 14.0
Ossas 10.0
对我的理解的任何帮助或更正将不胜感激。谢谢!
【问题讨论】:
-
发布您尝试解决问题的代码
-
可能有一种方法可以使用流来执行此操作,或者您可以构建一个值映射到计数,然后检查哪种模式
-
在
Data类上实现hashCode()和equals(),然后使用Set<Data>而不是ArrayList。 -
我添加了我的尝试。如有错误请指正
-
@SeanBright 我也是,一开始也在考虑一个 Set,直到我看到他们想要保留一个特定元素(模式,而不是第一个)
标签: java object variables arraylist filter