java 什么样的数据结构可以保持插入顺序,允许随机访问,并且不允许重复?

ezykj2lf  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(120)

我正在尝试实现一个数据结构,它接收并存储唯一的字符串。我必须能够删除和编辑所说的字符串。
我最初考虑使用数组列表,但问题是每个字符串都必须是唯一的,所以每次添加新字符串时,我都必须迭代列表以检查它是否存在。
然后我看了一下LinkedHashSet,它会使所有条目都是唯一的,因为不允许重复,它保持插入顺序,但不允许随机访问编辑字符串。我可以删除上述字符串并添加新编辑的字符串,但这会改变顺序。
根据我的要求,什么样的数据结构最适合用java实现?

bxjv4tth

bxjv4tth1#

我很快就创建了这个自定义集合,它的行为就像一个ArrayList,但是它不允许重复,你可能需要修改它来满足你的需要。

class UniqueArrayList<E> extends ArrayList<E> {

private static final long serialVersionUID = 1357048473879966517L;

public UniqueArrayList(int initialCapacity){
    super(initialCapacity);
}

public UniqueArrayList(){
    super();
}

// sets the given index to the given value 
// if the list doesn't contain an equivalent value
@Override
public E set(int index,E e){
    if(!contains(e)) {
    return super.set(index,e);
    }
    if(indexOf(e)==index) {
        return e;
    }
    throw new IllegalArgumentException("Cannot set a value already in the list");
}

@Override
public boolean add(E e){
    if(!contains(e)) {
    super.add(e);
    return true;
    }
    return false;
}

@Override
public void add(int index,E e){
    if(!contains(e)) {
    super.add(index,e);
    }
}

@Override
public boolean addAll(Collection<? extends E> c){
    boolean someAdded = false;
    for(E item : c) {
        if(!contains(item)) {
            super.add(item);
            someAdded = true;
        }
    }
    return someAdded;
}

@Override
public boolean addAll(int index,Collection<? extends E> c){
    boolean someAdded = false;
    for(E item : c) {
        if(!contains(item)) {
            super.add(index,item);
            index++;
            someAdded = true;
        }
    }
    return someAdded;
  }
 }

相关问题