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

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

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

  1. import java.util.*;
  2. public class CompareElements {
  3. private static List<Map<String, String>> sample = new ArrayList<>(0);
  4. private static int MIN = 0;
  5. private static int MAX = 10;
  6. static {
  7. populateListOfMaps();
  8. }
  9. /*
  10. * This is the main part of the question, rest is just to generate test data..
  11. * /
  12. public static void main(String[] args){
  13. // Can we simplify this part using lambda's or any library?
  14. for (int i = 0; i < sample.size() -1; i++) {
  15. for (int j = i+1; j < sample.size(); j++) {
  16. Map<String, String> referenceMap = sample.get(i);
  17. Map<String, String> candideMap = sample.get(j);
  18. if(referenceMap.get("key").equalsIgnoreCase(candideMap.get("key"))){
  19. System.out.println("Equal : " + i + " || " + referenceMap.get("key") + " and "+ j + " || " + candideMap.get("key") + " are pairs");
  20. } else {
  21. System.out.println("Not equal : " + i + " || " + referenceMap.get("key") + " and "+ j + " || " + candideMap.get("key") + " are pairs");
  22. }
  23. }
  24. }
  25. }
  26. private static void populateListOfMaps(){
  27. if(sample.size() <= 10){
  28. Map<String, String> someMap = new HashMap<>(0);
  29. someMap.put("key", "value" + randInt(MIN, MAX));
  30. sample.add(someMap);
  31. populateListOfMaps();
  32. }
  33. }
  34. public static int randInt(int min, int max) {
  35. Random rand = new Random();
  36. int randomNum = rand.nextInt((max - min) + 1) + min;
  37. return randomNum;
  38. }

}
我的要求是比较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());
}

  1. 这将打印具有相同“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列表中的每个元素与后续元素进行比较:
使用按键如何?

  1. Set<String> s1 = new HashSet< String >(referenceMap.values());
  2. Set<String> s2 = new HashSet< String >(candideMap.values());
  3. // Get intersection of values
  4. s1.retainAll(s2);
  5. // You can also get corresponding keys for each value later

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

展开查看全部

相关问题