是否可以用另一个元素替换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
答案 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]