raf*_*kob 33 java list linkedhashset
我需要一个保持插入顺序并具有唯一值的集合.LinkedHashSet看起来像是要走的路,但是有一个问题 - 当两个项相等时,它会移除最新的一个(这是有意义的),这是一个例子:
set.add("one");
set.add("two");
set.add("three");
set.add("two");
Run Code Online (Sandbox Code Playgroud)
该LinkedHashSet会打印:
one,two,three
但我需要的是:
one,three,two
这里最好的解决方案是什么?是否有任何可以执行此操作的集合/集合方法,还是应该手动实现它?
Old*_*eon 34
大多数Java集合都可以进行扩展以进行调整.
子类LinkedHashSet,重写add方法.
class TweakedHashSet<T> extends LinkedHashSet<T> {
@Override
public boolean add(T e) {
// Get rid of old one.
boolean wasThere = remove(e);
// Add it.
super.add(e);
// Contract is "true if this set did not already contain the specified element"
return !wasThere;
}
}
Run Code Online (Sandbox Code Playgroud)
Hol*_*ger 18
您可以简单地使用以下特殊功能LinkedHashMap:
Set<String> set = Collections.newSetFromMap(new LinkedHashMap<>(16, 0.75f, true));
set.add("one");
set.add("two");
set.add("three");
set.add("two");
System.out.println(set); // prints [one, three, two]
Run Code Online (Sandbox Code Playgroud)
在Oracle的JRE中,无论如何都有LinkedHashSet一个支持LinkedHashMap,所以没有太多的功能差异,但这里使用的特殊构造函数配置不仅在插入时LinkedHashMap更改每次访问的顺序.这可能听起来太多了,但实际上只影响已经包含的键(在意义上的值)的插入.其他受影响的操作(即)不会被返回使用.SetMapgetSet
如果您不使用Java 8,由于类型推断有限,您必须帮助编译器:
Set<String> set
= Collections.newSetFromMap(new LinkedHashMap<String, Boolean>(16, 0.75f, true));
Run Code Online (Sandbox Code Playgroud)
但功能是一样的.
初始化您的LinkedHashSet时,您可以覆盖add方法.
Set<String> set = new LinkedHashSet<String>(){
@Override
public boolean add(String s) {
if(contains(s))
remove(s);
return super.add(s);
}
};
Run Code Online (Sandbox Code Playgroud)
现在它给你:
set.add("1");
set.add("2");
set.add("3");
set.add("1");
set.addAll(Collections.singleton("2"));
// [3, 1 ,2]
Run Code Online (Sandbox Code Playgroud)
甚至addAll方法也正常工作.
| 归档时间: |
|
| 查看次数: |
9854 次 |
| 最近记录: |