所以我有一个 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) 我也是feel这不是最快的方法。有更好的解决办法吗?
注意:我必须使用 linkedHashMap。
一种方法是使用内置替换的 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();
}
};
}
}
但这意味着在填充集合之前必须知道替代者。
(当然你可以很容易地把这个<String>
版本转换为通用版本。
回复评论:
OK,那么不经过完整的迭代是没有办法解决的。但是,您可以保持 LinkedHashSet 不变,并在检索值时装饰迭代器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)