【问题标题】:Java: Avoid inserting duplicate in arraylistJava:避免在数组列表中插入重复项
【发布时间】:2013-09-25 19:44:04
【问题描述】:

我是java新手。我有一个ArrayList,我想避免在插入时重复。我的ArrayList

ArrayList<kar> karList = new ArrayList<kar>();

我要检查的字段是:

 kar.getinsertkar().

我读到我可以使用HashSetHashMap,但我不知道。

【问题讨论】:

  • "但我不知道" 你是什么意思?使用HashSet,就像你读过的一样。
  • 请注意,没有规则规定您不能both ArrayListHashSet 具有相同的元素。您可以使用ArrayList 将元素保持在您想要的顺序,并使用HashSet 检查元素是否已经存在。 (检查会比搜索ArrayList 更快,但维护两个集合会减慢速度。)有时这是做事的正确方法。

标签: java data-structures


【解决方案1】:

当你想防止重复时,你想使用Set

在这种情况下,HashSet 对你来说就可以了。

HashSet karSet = new HashSet();
karSet.add(foo);
karSet.add(bar);
karSet.add(foo);
System.out.println(karSet.size());
//Output is 2

为了完整起见,我还建议您使用该类的通用(参数化)版本,假设 Java 5 或更高版本。

HashSet<String> stringSet = new HashSet<String>();
HashSet<Integer> intSet = new HashSet<Integer>();
...etc...

这将为您提供一些类型安全性,以及让您的物品进出您的集合。

【讨论】:

  • 通常我们也使用 vars 类型的接口:Set&lt;String&gt; stringSet = new HashSet&lt;String&gt;(); 而不是实现
【解决方案2】:

集合只是一个集合,不能包含重复项,因此听起来很适合您。

实现起来也很简单。例如:

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

这将为您提供一个可以容纳 String 类型的对象的集合。

添加到集合中也很简单:

mySet.add("My first entry!");

根据集合的定义,您可以添加任何您想要的内容,并且永远不会遇到重复。

玩得开心!

编辑:如果您决定使用 ArrayList,那么在添加之前查看对象是否已经在列表中很简单。例如:

public void addToList(String newEntry){
    if(!myList.contains(newEntry))
        myList.add(newEntry);
}

注意:我的所有示例都假设您使用的是 String 对象,但它们可以轻松地交换为任何其他 Object 类型。

【讨论】:

    【解决方案3】:

    使用HashSet 而不是ArrayList。但是,要真正使HashSet 真正运行良好,您必须覆盖插入到HashSet 中的类/对象的equals()hashCode() 方法。

    敌人示例:

     Set<MyObject> set = new HashSet<MyObject>();
     set.add(foo);
     set.add(bar);
    
     public class MyObject {
         @Override
         public boolean equals(Object obj) {
             if (obj instanceof MyObject)
                 return (this.id = obj.id) 
             else
                 return false;
         }
         // now override hashCode()
    }
    

    请参阅以下documentation 以覆盖hashCode()equals()

    【讨论】:

    • 我在课堂上到处使用arraylist来做其他方法,我该如何改变它?
    • +1 好建议,我们可以指出进入集合的对象应该实现适当的 equals() 和 hashCode() 方法。
    • HashSet中使用的方法应该和ArrayList一样,因为它们都实现了相同的接口。
    • @blackpanther 不,ArrayListHashSetLinkedHashSet 没有的方法,尤其是get(int index)。我们不知道提供这些方法有多重要。
    • @ajb 我的错。我忘记了。
    【解决方案4】:

    您可以使用LinkedHashSet,以避免重复元素并保持插入顺序。

    http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html

    【讨论】:

      【解决方案5】:

      您需要使用任何Set 实现,例如您可以使用HashSet。 如果你想add自定义对象kar变成你的HashSet,你需要overrideequalshashcode方法。 你可以阅读更多关于equalshashcodesee

      【讨论】:

        【解决方案6】:

        您可以实现自己的 List 扩展 LinkedList 并覆盖其添加方法:

        1. 公共布尔加法(E e)
        2. public void add(int index, E element)
        3. public boolean addAll(Collection collection)
        4. public boolean addAll(int index, Collection collection)

        【讨论】:

          【解决方案7】:

          删除 ArrayList 中重复字符串的示例:

          var list = new ArrayList<>(List.of(
                  "hello",
                  "java",
                  "test",
                  "hello"
          ));
          
          System.out.println(list);
          
          System.out.println(new ArrayList<>(new HashSet<>(list)));
          

          输出:

          [hello, java, test, hello]
          [java, test, hello]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-08
            • 1970-01-01
            • 2021-03-06
            • 1970-01-01
            • 2015-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多