【问题标题】:Matching several ArrayList to find those similar lists匹配几个 ArrayList 以找到那些相似的列表
【发布时间】:2017-02-07 09:21:00
【问题描述】:

我有三个列表:

List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<String>();
List<String> list3 = new ArrayList<String>();

list1.add("return");
list1.add("==");
list1.add("NULL");
list1.add("&&");
list1.add("password");

list2.add("password");
list2.add("&&");
list2.add("return");
list2.add("==");
list2.add("NULL");

list3.add("return");
list3.add("==");
list3.add("NULL");

我想将list1与list2和list3进行比较,如果相似度> = 0.6,则表示它们是相似列表。在本例中,list2 和 list3 都是相似的列表。

【问题讨论】:

  • 问题是?
  • (1) 如何定义相似度? (2) 你最好的尝试在哪里,失败的原因是什么?
  • 如果list4有list4.add("str.length"); list4.add("
  • 感谢您的澄清。更好的是,编辑您的问题并在其中添加信息。

标签: java arraylist match


【解决方案1】:

您可以使用 Java 8 Stream 来做到这一点: 使用过滤器,您可以获得出现在第一个列表和第二个或第一个和第三个列表中的所有元素。然后,使用 count 你可以检查他们的数量。

long same12 = list1.stream()
                   .filter(s -> list2.contains(s))
                   .count();
long same13 = list3.stream()
                   .filter(s -> list1.contains(s))
                   .count();

System.out.println(((double)same12/(double)list1.size()) >= 0.6 ? "They are similar" : "They aren't similar");
System.out.println(((double)same13/(double)list1.size()) >= 0.6 ? "They are similar" : "They aren't similar");

【讨论】:

    【解决方案2】:

    当我们拥有良好的旧 Java 集合集操作时,我认为这里没有很好的理由使用流(除了我们中的一些人喜欢流)。这种方法应该可以满足您的要求:

    public static boolean areSimilar(List<String> list1, List<String> list2) {
        List<String> sameElements = new ArrayList<>(list1);
        sameElements.retainAll(list2);
        double similarity = ((double) sameElements.size()) / list1.size();
        return similarity > 0.5999999;
    }
    

    我已将阈值设置为略低于您的 0.6,以确保舍入误差不会导致错过 3 / 5 的相似性。

    根据这种方法,你的三个列表中的任何两个都是相似的。在这些情况下,areSimilar(list1, list2)areSimilar(list2, list1) 也会产生 true

    说我介绍

        List<String> list4 = Arrays.asList("return", "password");
    

    现在areSimilar(list1, list4)false,但areSimilar(list4, list1) 是真的。在某些情况下,参数的顺序很重要,因为您在相似性度量中使用第一个列表的大小,并且列表的大小不同。但是,areSimilar(list3, list4)areSimilar(list4, list3) 都会产生 false,因为这两个列表只有一个共同元素。

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 2015-05-05
      • 1970-01-01
      • 2021-05-25
      • 2021-05-31
      • 2018-07-27
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      相关资源
      最近更新 更多