1

毎秒数回 (おそらく 100/200ms 程度) 更新されるグラフを表示する小さなプログラムを作成する予定です。目的は、XY プロットのように、1000 以上の異なる値をグラフにプロットすることです。

配列に 1000 個の要素が含まれている場合、最後に新しい要素を追加し、その過程で他のすべての要素を 1 ステップ後退させたいと思います。要するに、要素 999 は 998 になり、998 は 997 になります...最初の要素までずっと、それは単純に破棄されます。通常の配列、Vector、LinkedList、またはその他の方法のいずれかを使用して、これを行うための例または適切なアルゴリズムを誰かが持っていますか?

私の最初の考えは、新しい配列を作成し、保持したい要素を新しい配列にコピーして、最初の 100 個の要素を捨てることです。この時点で、配列の最後に新しい 100 個の要素を追加し、このプロセスを繰り返し続けますが、これを行うためのより良い方法があるに違いありません。

4

3 に答える 3

1

あなたが求めているのは、アルゴリズムの世界では deque と呼ばれます。つまり、両端のベクトルです。

それがあなたが必要とするクラスです。

基本的に deque は、シーケンスの先頭と末尾の両方からの要素の追加と削除をサポートしています。

EDIT実際にドキュメントを読んで、dequeのsdk実装が直接インデックス作成をサポートしていないことに驚きました(私はC ++でこの構造を使用することに慣れています)。だから私は検索を続け、このライブラリにリンクしているこの答えを見つけました。これはあなたに役立つかもしれません.

于 2012-04-21T18:36:28.737 に答える
1

配列を使用しないでください。すべての要素を移動する複雑さはひどいものです! このタスクに最適な Java データ構造はDequeだと思います。

于 2012-04-21T18:36:39.903 に答える
0

同じアレイを再利用し続け、最初から再起動します。より明確にするために、要素が 1..1000 の配列があるとします。

int[] array =  new int[1000];
...
array = {1, 2, ...., 1000 };

要素 1001 を追加する必要がある場合、配列 {2, 3, ..., 1000, 1001} を使用する代わりに、配列 {1001, 2, 3, ... 1000} を使用し、配列が実際に開始するインデックスを追跡します。これにより、begin-index への単純なカウンターを保持することで、すべての要素を移動する難しさが解消されます。自分で簡単にするために、ユーティリティメソッドを導入できます

private int startIndex = 1;//0 at the start
//I assume we are in the situation with array {1001, 2, 3, ..., 1000 }

public int convertIndex( int index ){
  return (index + startIndex) % 1000;
}
于 2012-04-21T18:49:27.043 に答える