用Java中的Set中的另一个元素替换现有元素

时间:2014-07-30 13:21:06

标签: java set

是否可以用另一个元素替换java.util.Set的元素?下面给出一个简单的例子。

Set<String> set=new LinkedHashSet<String>() {{
    add("A");
    add("B");
    add("C");
    add("D");
}};

if(set.contains("C")) {
    set.remove("C");
    set.add("E");
}

for(String str:set) {
    System.out.println(str);
}

此示例首先删除元素,然后添加另一个元素。这样做会在Set

的底部添加元素

在完成foreach循环后输出如下。

A
B
D
E

是否可以通过保留其原始位置的另一个元素替换现有元素,以便输出如下所示?

A
B
E
D

3 个答案:

答案 0 :(得分:1)

没有。 LinkedHashSet.add继承自HashSet.add。在LinkedHashSet上使用它将在底层链接列表的末尾添加元素。

答案 1 :(得分:1)

上面的所有答案都不能用Set做到。您可以通过将集添加到列表,然后执行操作然后返回设置来实现此目的。但那非常昂贵。或者,如果您特别关注此类实现,可以使用Apache Commons ListOrderedSet。请注意,据我所知,这并不支持泛型。因此,要么你必须特别注意类型安全,否则你可以进行明确的投射。实施例

import java.util.Set;

import org.apache.commons.collections.set.ListOrderedSet;

public class Sample {

    public static void main(String[] args) {
        @SuppressWarnings("unchecked")
        Set<String> set = new ListOrderedSet();
        set.add("A");
        set.add("B");
        set.add("C");
        set.add("D");

        System.out.println(set); // Prints [A, B, C, D]
        int indexToRemove = ((ListOrderedSet) set).indexOf("C");
        if (indexToRemove != -1) {
            set.remove("C");
            ((ListOrderedSet) set).add(indexToRemove, "E");
        }
        System.out.println(set); // Prints [A, B, E, D]
    }
}

答案 2 :(得分:0)

public static void main(String[] args) {
    Set<String> set = new LinkedHashSet<String>();
    set.add("A");
    set.add("B");
    set.add("C");
    set.add("D");
    System.out.println(set);

List<String> list = new ArrayList<String>();
list.addAll(0, set);
System.out.println(list);

if(list.contains("C")){
       int i = list.indexOf("C");
       list.add(i, "E");
       list.remove("C");
}

set.removeAll(set);
//System.out.println(list);
//System.out.println(set);
set.addAll(list);
System.out.println(set);
}

使用此解决方案,您必须使用不需要的List:(

output :[A,B,E,D]