Java 比较同一列表的两个列表元素之间的值

Java 比较同一列表的两个列表元素之间的值,java,list,arraylist,lambda,comparison,Java,List,Arraylist,Lambda,Comparison,我需要对以下类型的列表中的值进行比较 List<org.bson.Document> 列表 数据是一个Bson文档,有两个键:值对(名称和分数)。我需要反复浏览这个列表,删除每个高尔夫球手的最低分数。因此,如果Joe打了两场比赛,第一场比赛他得了72分,第二场比赛他得了86分,因为这是高尔夫,86是两个得分中较低的一个,我需要从列表中删除得分为86的元素。这将为每个高尔夫球手留下两个较高的分数,并允许我只比较高分(较低的数值) 使用Java 1.8的任何更新功能进行此操作的最佳方

我需要对以下类型的列表中的值进行比较

List<org.bson.Document>
列表
数据是一个Bson文档,有两个键:值对(名称和分数)。我需要反复浏览这个列表,删除每个高尔夫球手的最低分数。因此,如果Joe打了两场比赛,第一场比赛他得了72分,第二场比赛他得了86分,因为这是高尔夫,86是两个得分中较低的一个,我需要从列表中删除得分为86的元素。这将为每个高尔夫球手留下两个较高的分数,并允许我只比较高分(较低的数值)

使用Java 1.8的任何更新功能进行此操作的最佳方法是什么?或者,我是否必须复制列表,然后在名称相等的情况下将列表A中的元素x与列表B中的元素x+1进行比较(经过适当排序)?

是否必须使用列表? 尝试使用hashMap,这样你可以检查你试图插入hashMap的玩家是否已经存在,如果已经存在,你可以查看他的分数,如果更糟,你可以覆盖它。 在那之后,你应该得到得分最高的玩家的hashMap

编辑:
我的错。。我没有仔细阅读你的问题。您必须使用bson.Document数据类型。在这种情况下,您可以使用treeSet并定义一个自定义比较器,如果两个元素(player)具有相同的名称,该比较器将返回0(true)。然后,您可以应用与原始答案中所述相同的登录。

我并不真正了解1.8,但我只需比较同一列表中的条目,而无需创建第二个条目。我会这样做(使用伪方法,我不知道bson):


for(int i=0;i我不太清楚你的问题。但是从描述中我了解到,我建议你使用HasMap>


通过这种方式,您将能够对每个玩家的值进行排序,并可以轻松删除最低分数!!

如果您知道一种方法来遍历整个文档以获取分数,您可以按升序对列表进行排序。排序后,您可以从列表中删除最后一个元素。有多种方法可以对列表进行排序。一些主要的方法是重新冒泡排序和选择排序

您还可以查找最大值的索引并删除该元素。此方法更简单、更高效。我还将为您提供此方法的伪代码。在代码中,列出您分配的数组列表的名称

int max = list.get(0);
index = 0;
for(int i = 1; i < list.size(); i++)
{
if(list.get(i) > max)
{
max = list.get(i);
index = i;
}
}
list.remove(i);
int max=list.get(0);
指数=0;
对于(int i=1;i最大值)
{
max=list.get(i);
指数=i;
}
}
列表。删除(i);

我不熟悉bson,因此我尝试获取一系列名称、分数条目如下:

List<org.bson.Document> ldoc = new ArrayList<>();
Stream<Entry<String, Integer>> s
            = ldoc.stream()
            .flatMap(d -> d.entrySet().stream())
            .map(e -> new AbstractMap.SimpleImmutableEntry<String,Integer>(e.getKey(),((Integer)e.getValue())));
也就是说,这是一张地图,上面列出了每个球员的最低分数

要获得优胜者:

String winner = m.entrySet()
            .stream()
            .min((e1, e2) -> Integer.compare(e1.getValue().get(), e2.getValue().get()))
            .get().getKey();
System.out.println("winner = " + winner);
其中打印:

winner = Joe

这是一个文档列表还是文档包含一个列表?你想每个玩家只保留一个条目,还是每个玩家只保留最差的条目?或者用另一种方式说:你的示例是每个玩家大约有两个分数,是否总是这样,或者你能将其重新表述为两个以上的分数?
Map<String, Optional<Integer>> m = l.stream()
            .collect(Collectors.groupingBy(e -> e.getKey(),
                            Collectors.mapping(e -> e.getValue(),
                                    Collectors.minBy((i1, i2) -> Integer.compare(i1, i2)))));
System.out.println("m = " + m);
m = {Joe=Optional[66], John=Optional[73]}
String winner = m.entrySet()
            .stream()
            .min((e1, e2) -> Integer.compare(e1.getValue().get(), e2.getValue().get()))
            .get().getKey();
System.out.println("winner = " + winner);
winner = Joe