如何在java中比较列表元素和Map元素?

92dk7w1h  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(466)

我有以下代码(带有一些示例数据),并希望检查是否有更好或更有效的方法将map列表中的每个元素与后续元素进行比较:

import java.util.*;

public class CompareElements {

private static List<Map<String, String>> sample = new ArrayList<>(0);
private static int MIN = 0;
private static int MAX = 10;

static {
    populateListOfMaps();
}

/*

* This is the main part of the question, rest is just to generate test data..
* /

public static void main(String[] args){
    // Can we simplify this part using lambda's or any library?
    for (int i = 0; i < sample.size() -1; i++) {
        for (int j = i+1; j < sample.size(); j++) {
            Map<String, String> referenceMap = sample.get(i);
            Map<String, String> candideMap = sample.get(j);
            if(referenceMap.get("key").equalsIgnoreCase(candideMap.get("key"))){
                System.out.println("Equal : " + i + " || "  + referenceMap.get("key") + " and "+ j + " || " + candideMap.get("key") + " are pairs");
            } else {
                System.out.println("Not equal : " + i + " || "  + referenceMap.get("key") + " and "+ j + " || " + candideMap.get("key") + " are pairs");
            }
        }
    }   
}

private static void populateListOfMaps(){
    if(sample.size() <= 10){
        Map<String, String> someMap = new HashMap<>(0);
        someMap.put("key", "value" + randInt(MIN, MAX));
        sample.add(someMap);
        populateListOfMaps();
    } 
}

public static int randInt(int min, int max) {
    Random rand = new Random();
    int randomNum = rand.nextInt((max - min) + 1) + min;
    return randomNum;
}

}
我的要求是比较Map列表中的每个元素,然后检查是否相等以删除重复项,这是一个简单的部分,但我的实时应用程序中的每个Map都有2个键值(但都是字符串)。。没有自定义pojo对象)。
上面的代码可以工作,但我希望使这个代码更简洁和性能更好。
我们可以使用lambdas或streams吗?

iszxjhcz

iszxjhcz1#

当您从mongodb获取数据时,我假设您无法控制模式,因此使用pojo不是一个简单的选择(它可以用生成的代码来完成,但您可能不想去那里)
你能做的就是 groupingBy 要改变这一切 O(n^2) 循环到 O(n) ```
public static void main(String... args) {
List<Map<String, String>> sample = populateListOfMaps();
sample.stream()
.collect(Collectors.groupingBy(m -> m.get("key")))
.forEach((key, list) -> System.out.println(key + " : " + list));
}

private static List<Map<String, String>> populateListOfMaps() {
Random rand = new Random();
return IntStream.range(0, 10)
.mapToObj(i -> {
Map<String, String> someMap = new HashMap<>(2);
someMap.put("key", "value-" + rand.nextInt(10));
return someMap;
})
.collect(Collectors.toList());
}

这将打印具有相同“key”值的所有条目 `O(n)` 时间复杂性。例如

value-9 : [{key=value-9}]
value-8 : [{key=value-8}, {key=value-8}, {key=value-8}]
value-5 : [{key=value-5}]
value-7 : [{key=value-7}, {key=value-7}]
value-1 : [{key=value-1}]
value-0 : [{key=value-0}]
value-2 : [{key=value-2}]

cetgtptt

cetgtptt2#

我不确定你的具体要求是什么,所以要一次解决一部分问题:
检查是否有更好或更有效的方法将Map列表中的每个元素与后续元素进行比较:
使用按键如何?

Set<String> s1 = new HashSet< String >(referenceMap.values());
Set<String> s2 = new HashSet< String >(candideMap.values());

// Get intersection of values
s1.retainAll(s2);

// You can also get corresponding keys for each value later

这会减少你的复杂性 O(n^2)O(n) 我的实时应用程序中的每个Map都有2个键值(但都是字符串)。。没有自定义pojo对象)。
不知道你说的实时是什么意思。Map是实时变化的吗?你的和我的解决方案都不是线程安全的。
你是说每个条目有两个键值吗?如果每个键有2个值,则可能会覆盖 hashcode() , equals() 你的代码应该能用。
如果我误解了你的问题,请告诉我

相关问题