根据Java中对象属性的最常用值筛选对象的Arraylist

根据Java中对象属性的最常用值筛选对象的Arraylist,java,object,variables,arraylist,filter,Java,Object,Variables,Arraylist,Filter,我试图根据对象变量的值过滤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

我试图根据对象变量的值过滤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));
}
如您所见,arraylist中会有重复项。我只能在它成为arraylist后对其进行过滤,因为我正在读取文件,然后将其放入arraylist

我试图实现的输出如下所示

Uvumvew,10
Ossas,10
Dummy,7
Collection<Data> nonDuplicatedName = list.stream()
               .<Map<String, Data>> collect(HashMap::new,(m,e)->m.put(e.getName(), e), Map::putAll)
               .values();
因为10,10,7分别是Uvumvew、Ossas和假人最常见的值。我尝试过使用Collection并过滤值,但由于对象中包含重复的值,因此不可能

我的尝试是这样的

Uvumvew,10
Ossas,10
Dummy,7
Collection<Data> nonDuplicatedName = list.stream()
               .<Map<String, Data>> collect(HashMap::new,(m,e)->m.put(e.getName(), e), Map::putAll)
               .values();

如对我的理解有任何帮助或更正,将不胜感激。谢谢

这可能有点过于复杂,而且使用中间映射会带来开销,但这应该可以解决您的问题:

Map<String, Map<Double,Long>> tmpMap = list.stream()
        .collect(
                groupingBy(Data::getName,
                        groupingBy(Data::getValue,counting())
                ));
// {Dummy={8.0=2, 7.0=3}, Ossas={10.0=3, 5.0=2}, Uvumvew={10.0=3, 11.0=1, 14.0=2}}

我希望这会有所帮助。

发布您针对问题尝试的代码可能有一种使用streams的方法,或者您可以构建一个值到计数的映射,然后检查哪个是modeImplement
hashCode()
equals())
数据
类上,然后使用
集合
而不是
数组列表
。我添加了我的尝试。如果是,请纠正我wrong@SeanBright起初我也在想一套,直到我看到他们想要保留一个特定的元素(模式,而不是第一个),非常感谢你的回答。我很清楚这个概念但是,counting()和toList()方法返回一个错误。有什么我必须导入或JDK更改的吗???@SmileyHuehue,欢迎您。是的,您需要导入收集器:
import static java.util.stream.Collectors.*如果您觉得这个答案有用,请不要忘记接受它
tmpMap.entrySet()
        .stream()
        .map(
                entry -> new Data(
                        entry.getKey(),
                        entry.getValue().entrySet().stream()
                                .max(Map.Entry.comparingByValue()).get().getKey()
                )
        ).collect(toList()); 
//[Data{name='Dummy', value=7.0}, Data{name='Ossas', value=10.0}, Data{name='Uvumvew', value=10.0}]