1

我有几个不同元素的向量,但都扩展了一个具有特定功能的类,例如

Vector<classone> one;
Vector<classtwo> two;
Vector<classthree> three;

而classone、classtwo和classthree扩展了Number,并且number有两个作用:

doThing()
getValue()

我想要的是按照从所有向量接收到的 getValues 的顺序调用 doThing 。

一种便宜的解决方案是将所有向量连接到一个 Vector 中,按值排序并迭代以调用该函数,但这使我不得不创建一个巨大的新向量,占用新的 ram,并且由于 doThing 将发生 60 次第二,如果向量变大,这可能是一种矫枉过正,我真的不想创建一个新的向量只是为了对其进行排序,是否有任何其他使用现有向量的解决方案?

它的Java顺便说一句。

4

2 回答 2

1

过早的优化通常是一个坏主意

尝试首先想到的方法:创建一个巨大的1并对其进行排序。如果结果证明是性能问题,那么您可以开始尝试新事物。Vector ArrayList

于 2013-07-07T05:40:10.097 回答
1

如果one,twothree已排序,您可以创建一个自定义迭代器,检查给定列表集的当前位置的最小值是什么,然后继续。

应该看起来与此类似(未经测试):

class MultiListIterator {
  List<Number>[] lists;
  int[] positions;

  MultiListIterator(List<Number>... lists) {
    this.lists = lists;
    positions = new int[lists.length];
  }

  boolean hasNext() {
    for (int i = 0; i < lists.length; i++) {
      if (positions[i] < lists[i].length) return true;
    }
    return false;
  }

  Number next() {
    int bestIndex = -1;
    Number bestNumber = null;
    for (int i = 0; i < lists.length; i++) {
      var p = positions[i];
      if (p >= positions[i].length) continue;
      Number n = lists[i].get(p);
      if (bestNumber == null || n.getValue() < bestNumber.getValue()) {
        bestIndex = i;
        bestNumer = n;
      }
    }
    if (bestNumber == null) throw new RuntimeException("next() beyond hasNext()");
    positions[bestIndex++];
    return bestNumber;
  }
}

用法:

MultiListIterator mli = new MultiListIterator(one, two, three);
while (mli.hasNext()) {
  mli.next().doThing();
}

您可能想让MultiListIterator实施Iterator<Number>.

请注意,Java 已经有一个内置类 Number。当您忘记在某处导入它时,为您的类使用相同的名称可能会导致很多混乱。

于 2013-07-07T05:44:08.567 回答