Java列表-插入或替换的最佳方法

时间:2019-06-18 12:13:56

标签: java collections

所以我想知道什么是最好的方式

  • 如果元素尚不存在,请执行插入
  • 如果元素已经存在,请执行更新

对于这样的用例,列表可能不是最好的数据结构?

4 个答案:

答案 0 :(得分:6)

如果要使用uniqe元素,请使用Set insted of list

Set<your_object_type> name = new HashSet<>();

如果要使用相同的值更新,请执行

name.add(val);

如果要使用不同的值进行更新,请使用以下代码

if(name.remove(val1)){
name.add(val2);
}

答案 1 :(得分:1)

我认为ArrayList是更好的选择,set(E e)的{​​{1}}方法提供了 O(1) 更换时间性能。与java.util.ArrayList一起使用的remove(E e)更昂贵。

add(E e)

只要您的List<People> peoples = new ArrayList<People>(); peoples.set(getIndexToUpdate(), new People("Ali", "Lahore")); 不可变,就可以使用此方法。

ArrayList中的add(E e)不会更新docs中已经存在的元素。

  

将指定的元素添加到该集中(如果尚不存在)   (可选操作)。更正式地说,将指定元素e添加到   如果集合中不包含任何元素e2,则该集合(e == null?   e2 == null:e.equals(e2))。如果此集合已经包含该元素,   调用将保留设置不变,并返回false。结合   通过限制构造函数,可以确保   包含重复元素。以上规定并不意味着   集必须接受所有元素;集可能拒绝添加任何特定内容   元素(包括null)并引发异常,如   Collection.add的规范。单独设置的实现   应该清楚地记录对它们可能构成要素的任何限制   包含。

答案 2 :(得分:0)

您可以使用“ HashSet”并使用方法“ contains”来检查元素是否已经存在。如果没有,您可以添加所需的元素。例如:

Set<Integer> setOfIntegers = new HashSet<>();
if(!setOfIntegers.contains(23)){
    setOfIntegers.add(23);
}

现在,您可以检查集合中是否包含所需元素,将其删除并添加另一个元素

if(setOfIntegers.contains(23)){
    setOfIntegers.remove(23);
    setOfIntegers.add(50);
}

现在将设置的更新值“ 23”设置为新值“ 50”

答案 3 :(得分:0)

以下是将Item类型的自定义对象添加到Set<Item>或更新现有对象的示例:

Item.java

public class Item {

    private String name;
    private int position;

    public Item(String name, int position) {
        super();
        this.name = name;
        this.position = position;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

}

Main.java

public class Main {

    public static void main(String args[]) {

        Set<Item> myUniqueStrings = new HashSet<Item>();

        Item a = new Item("A", 1);
        Item b = new Item("B", 2);
        Item c = new Item("D", 3);
        Item d = new Item("D", 4);

        // add some of the items to the Set
        myUniqueStrings.add(a);
        myUniqueStrings.add(b);
        myUniqueStrings.add(c);

        System.out.println("———> Before update:");
        myUniqueStrings.forEach(item -> System.out.println(item.getName() 
                + " at position " + item.getPosition()));

        // update an item that exists in the Set
        c.setName("C");
        System.out.println("———> After update of an item in the Set:");

        myUniqueStrings.forEach(item -> System.out.println(item.getName() 
                + " at position " + item.getPosition()));

        System.out.println("———> After having added a new item to the Set:");

        // add a new item to the Set
        myUniqueStrings.add(d);
        myUniqueStrings.forEach(item -> System.out.println(item.getName() 
                + " at position " + item.getPosition()));

        System.out.println("———> After having tried to insert an already existing item to the Set:");

        // add an already existing item to the Set
        myUniqueStrings.add(a);
        myUniqueStrings.forEach(item -> System.out.println(item.getName()
                + " at position " + item.getPosition()));
    }
}

请注意,如果第二次将Item添加到Set,则完全没有变化。