如何在Java中高效地实现数组元素查找和删除?

如何在Java中高效地实现数组元素查找和删除?,java,arrays,algorithm,Java,Arrays,Algorithm,给定已排序的对象数组,而顺序基于某个对象属性。(排序是通过使用Collections.sort()和自定义比较器的列表完成的,然后调用toArray() 不允许SomeObject的重复实例(“重复”在这方面取决于SomeObject中的多个属性值),但SomeObject的多个实例可能具有用于排序的attribute1的相同值 public SomeObject { public attribute1; public attribute2; } List<SomeObject&

给定已排序的对象数组,而顺序基于某个对象属性。(排序是通过使用Collections.sort()和自定义比较器的列表完成的,然后调用toArray()

不允许SomeObject的重复实例(“重复”在这方面取决于SomeObject中的多个属性值),但SomeObject的多个实例可能具有用于排序的attribute1的相同值

public SomeObject {
  public attribute1;
  public attribute2;
}

List<SomeObject> list = ...
Collections.sort(list, new Comparator<SomeObject>() {
  @Override
  public int compare(SomeObject v1, SomeObject v2) {
    if (v1.attribute1 > v2.attribute1) {
      return 1;
    } else if (v1.attribute1 < v2.attribute1) {
      return -1;
    } else
      return 0;
  }
});
SomeObject[] array = list.toArray(new SomeObject[0]);
公共对象{
公共属性1;
公共属性2;
}
列表=。。。
Collections.sort(list,newcomparator(){
@凌驾
公共整数比较(SomeObject v1,SomeObject v2){
如果(v1.attribute1>v2.attribute1){
返回1;
}else if(v1.attribute1
如何有效地检查基于某个属性的某个对象是否在该数组中,同时还能够“标记”在以前的某个查找中已找到的对象(例如,只需将其从数组中删除;已找到的对象以后无需访问)

如果没有后面的要求,就可以使用自定义比较器执行Arrays.binarySearch()。但是当你想移除已经找到的对象时,它显然不起作用。

使用(或)

你可以用比较器初始化它;它自己分类;查找和删除是对数时间


您还可以一步检查是否存在并删除,因为
remove
返回一个布尔值。

基于Arian的答案,您还可以使用Apache Commons的集合库。这由
树映射支持,并维护重复元素的计数。

如果需要,可以将所有元素放入某种链表中,当您对它们进行排序时,这些链表的节点也以堆形式连接。这样,找到一个元素将是log n,您仍然可以在适当的位置删除节点。

用于排序的属性是否与您正在搜索的属性相同?@Vivin:是的,就是这样。您可以有重复的对象吗?是否需要将数据保留在数组中?如果没有特殊原因不能使用其他数据结构,则它们更适合此任务。@JtheRocker:是和否:不允许重复SomeObject,但两个对象是否相等取决于多个属性,但attibute1的值可能,用于排序和查找的元素可能有相同的值。如果他想要重复元素呢:O?这还要求对象上的
等于
hashCode
返回他正在使用的属性的hashCode,我想。@vivinvalath不,它不需要。树集将使用比较器。@nChokk如果需要重复元素,则可能存在解决方法(例如,在第二个属性之后排序),或者使用Guavas排序的多集树集不起作用,因为多个对象的attribute1的值可能相等。