所以我有一个LinkedHashSet,其值表示A1,A2,B,C1,C2
我想更换,B为x,使得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的。
做到这一点是使用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不变和检索值时,装饰迭代器。
- 创建一个结构地图
- 插入所有字符串<字符串,OrderOfTheString>
- 当前字符串的OrderOfTheString后加入小的增量执行新的String的插入。
- 转换地图到LikedHashSet
我知道这是复杂的,但它是肯定更好,当我们链接的哈希地图〜百万元的和有大约1000个元素插入。