所以我有一个LinkedHashSet,其值为a1,a2,b,c1,c2
我想用x替换b,这样x的顺序应该与b的顺序相同。
一个显而易见的方法是
private LinkedHashSet<String> orderedSubstitution(final Set<String> originalOrderedSet, final String oldItem,
final String newItem) {
final LinkedHashSet<String> newOrderedSet = new LinkedHashSet<String>();
// Things we do to maintain order in a linkedHashSet
for (final String stringItem : originalOrderedSet) {
if (stringItem.equals(oldItem)) {
newOrderedSet.add(newItem);
} else {
newOrderedSet.add(stringItem);
}
}
return newOrderedSet;
}
不仅这是O(n)我还感觉这不是最快的方法。更好的解决方案? 注意:我必须使用linkedHashMap。
答案 0 :(得分:0)
一种方法是使用内置替换的LinkedHashSet子类,例如:
public class ReplacingLinkedHashSet extends LinkedHashSet<String> {
private final String what;
private final String with;
public ReplacingLinkedHashSet(String what, String with) {
this.what = what;
this.with = with;
}
@Override
public Iterator<String> iterator() {
final Iterator<String> iterator = super.iterator();
return new Iterator<String>() {
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public String next() {
String next = iterator.next();
return what.equals(next) ? with : next;
}
@Override
public void remove() {
iterator.remove();
}
};
}
}
但这意味着在填写Set之前必须知道替换。
(当然,您可以轻松将此<String>
版本转换为通用版本。
回应评论:
好的,没有完整的迭代就没有办法解决它。但是,您可以保持LinkedHashSet不变,并在检索值时修饰迭代器。
答案 1 :(得分:0)
我知道它很复杂,但是当我们链接~1000000元素的哈希Map并且大约有1000个要插入的元素时,它肯定会更好。