【问题标题】:How to check if two objects contain the same words regardless of order?无论顺序如何,如何检查两个对象是否包含相同的单词?
【发布时间】:2018-12-05 00:46:57
【问题描述】:

所以我有两个对象,names1 和 names2,它们只是用户选择输入的名称数组。我想创建一个代码来检查两个对象是否包含相同的单词,而不管顺序如何。喜欢

Enter names ( n to stop):
John
Charles
n

Enter names (n to stop):
Charles
John

true

【问题讨论】:

    标签: java arrays object arraylist boolean-operations


    【解决方案1】:

    将列表转换为字符串并比较字符串并不是一个好方法。如果名称包含空格、逗号或括号,您可能会陷入困境。最好保持字符串不同并按原样使用它们。

    当您想要存储一堆项目并且项目的顺序无关紧要时,您应该考虑“设置”而不是“列表”。集合是类似于列表的集合,但集合不保留顺序。

    Set<String> names;
    

    很棒的是你根本不需要你的Name 类。 Set&lt;String&gt; 完全符合您对自定义 Name 类所做的操作,而您根本无需编写任何代码。您可以将名称添加到集合中,并且可以将集合与 equals() 进行比较。

    public static boolean sameCoins(Set<String> n1, Set<String> n2) {
        return n1.equals(n2);
    }
    

    最常见的具体Set 实现是HashSet

    Set<String> names = new HashSet<>();
    

    哈希集快速高效,但它有一个明显的缺点:它不按顺序存储元素。如果你打印出散列集中的元素,它们看起来有点随机。它们不是您像列表那样插入它们的顺序,也不是按字母顺序排列的。如果这很重要,您可以切换到LinkedHashSet(保留插入顺序)或TreeSet(对项目进行排序)。

    【讨论】:

      【解决方案2】:

      使用List.containsAll(Collection)点赞,

      public boolean sameCoins(Name n) {
          return name.size() == n.name.size() && name.containsAll(n.name);
      }
      

      此外,您的构造函数当前具有原始类型(不要使用原始类型)。并编程到List接口。

      private List<String> name;
      
      public Name() {
          name = new ArrayList<>();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 2021-04-07
        • 1970-01-01
        相关资源
        最近更新 更多