1

さまざまな要素のベクトルがいくつかありますが、すべてが特定の機能を持つクラスを拡張しています。たとえば、

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

classone、classtwo、classthree は Number を拡張し、number には次の 2 つの関数があります。

doThing()
getValue()

そして、私が望むのは、すべてのベクトルから受け取った getValues の順序で doThing を呼び出すことです。

安上がりな解決策の 1 つは、すべてのベクトルを 1 つのベクトルに連結し、値で並べ替え、反復して関数を呼び出すことですが、それでは新しい RAM を占有する巨大な新しいベクトルを作成する必要があり、doThing が 60 回発生するため、 2番目に、ベクトルが大きくなった場合、それはやり過ぎかもしれません。ソートするためだけに新しいベクトルを作成したくありません。既存のベクトルを使用する他の解決策はありますか?

その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 に答える