只能包含一次值的列表

时间:2013-03-04 15:27:40

标签: java list

这肯定是一个菜鸟问题,但我无法在谷歌或这里找到一个好的答案,所以我不得不问:

当我只想要添加一次值时,我应该在Java中使用哪种列表?

问题在于我在大学(网上商店)做网络技术项目,而且我也连接了这个云。我可以向那些在我店里购买商品的客户提出要求。我想要做的是提取这些ID并将它们添加到列表中。但是在提取它们时,我得到了他们购买的每个项目的ID,所以我想要一个可以检查的列表:“这个值已经在这个列表中,什么都不做”,或者“这个ID不在列表中,让我们添加ID“

是否有可以执行此操作的列表,或者使用列表执行此操作而不会使其过于复杂?

5 个答案:

答案 0 :(得分:4)

您需要Set,这是防止重复的数据结构。这是Collection,因此您可以定义如下函数:

public Collection<MyObject> foo()
{
     return new HashSet<MyObject>();
}

稍后将内部的返回值更改为:

public Collection<MyObject> foo()
{
     return new ArrayList<MyObject>();
}

您的API不会中断。

答案 1 :(得分:2)

Set仅包含每个值一次。

虽然HashSet的问题在于添加元素的顺序会丢失。因此,如果您想保留元素的顺序,我建议您使用LinkedHashSet
使用LinkedHashSet,迭代元素将按插入顺序返回它们。

public static void main(String[] args) {
    Set<String> hashSet = new HashSet<>();
    hashSet.add("first");
    hashSet.add("second");
    hashSet.add("third");
    for (String s : hashSet) {
        System.out.println(s); // no particular order
    }

    Set<String> linkedHashSet = new LinkedHashSet<>();
    linkedHashSet.add("first");
    linkedHashSet.add("second");
    linkedHashSet.add("third");
    for (String s : linkedHashSet) {
        System.out.println(s); // "first", "second", "third"
    }
}

答案 2 :(得分:0)

public boolean insertRecord(Programmer targetProgrammer, List programmerList) {
boolean flag = false;
 for (Programmer p : programmerList){
   if (targetProgrammer.getId() == p.getId()) {
       return true;
}
}
return flag;
}

// Then when you invoke:

Programmer target = new Programmer(1,"Dev","Java");
if (!insertRecord(target, myList)) {
 myList.add(target);
}

答案 3 :(得分:0)

您要找的是Set,因为SetCollection,不包含重复内容。

根据您的需要,您可以使用几种类型:

  • HashSet的
  • LinkedHashSet
  • CopyOnWriteArraySet
  • EnumSet
  • TreeSet中
  • ConcurrentSkipListSet

答案 4 :(得分:-1)

更好地使用HashSet,因为它会隐式处理您的唯一ID问题。更好的是SortedSet,您可以自动按排序顺序打印唯一元素。