我有以下代码(带有一些示例数据),并希望检查是否有更好或更有效的方法将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吗?
2条答案
按热度按时间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());
}
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}]
cetgtptt2#
我不确定你的具体要求是什么,所以要一次解决一部分问题:
检查是否有更好或更有效的方法将Map列表中的每个元素与后续元素进行比较:
使用按键如何?
这会减少你的复杂性
O(n^2)
至O(n)
我的实时应用程序中的每个Map都有2个键值(但都是字符串)。。没有自定义pojo对象)。不知道你说的实时是什么意思。Map是实时变化的吗?你的和我的解决方案都不是线程安全的。
你是说每个条目有两个键值吗?如果每个键有2个值,则可能会覆盖
hashcode()
,equals()
你的代码应该能用。如果我误解了你的问题,请告诉我