整数をデータ構造体に保存したいのですが、整数の数字 がわからない場合があります。 私はデータベースをFIFOにしたいと思っています。 この目的には何が最適ですか?javaで使用する正しいデータ構造は何ですか?
答えて
データベースを使用する以外にも、いくつかの中間子がある場合は、それらをプレーンファイルに書き込むことができます。プレーンファイルは順序を保持しますが、エントリを削除すると高価になる可能性があります。
プレーンファイルを使用して約100万の整数を約0.1秒で書き換えたり書き換えたりできます。
intプリミティブの効率的なcollectonはTIntArrayListです。 @ JPelletierの提案と同様ですが、int []をラップします。百万のint値は約4 MBのメモリまたはディスクを必要とします。
EDIT:これは、100万の数値に対して、ArrayListが悪い選択であることを示しています。 (0)を削除ではなくOよりもO(n)がある主な理由は(1)
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
// based on http://www.cs.princeton.edu/introcs/43stack/RingBuffer.java.html
public class IntRingBuffer {
private final int[] a; // queue elements
private int N = 0; // number of elements on queue
private int first = 0; // index of first element of queue
private int last = 0; // index of next available slot
// cast needed since no generic array creation in Java
public IntRingBuffer(int capacity) {
a = new int[capacity];
}
public boolean isEmpty() { return N == 0; }
public int size() { return N; }
public void enqueue(int item) {
if (N == a.length) { throw new RuntimeException("Ring buffer overflow"); }
a[last] = item;
last = (last + 1) % a.length; // wrap-around
N++;
}
// remove the least recently added item - doesn't check for underflow
public int dequeue() {
if (isEmpty()) { throw new RuntimeException("Ring buffer underflow"); }
int item = a[first];
N--;
first = (first + 1) % a.length; // wrap-around
return item;
}
public static void main(String... args) {
int size = 1000000;
{
long start = System.nanoTime();
IntRingBuffer list = new IntRingBuffer(size);
for(int i=0;i< size;i++)
list.enqueue(i);
for(int i=0;i< size;i++)
list.dequeue();
long time = System.nanoTime() - start;
System.out.println(list.getClass().getSimpleName()+": Took "+time/1000/1000+" ms to add/remove "+size+" elements");
}
{
long start = System.nanoTime();
List<Integer> list = new LinkedList<Integer>();
for(int i=0;i< size;i++)
list.add(i);
for(int i=0;i< size;i++)
list.remove(0);
long time = System.nanoTime() - start;
System.out.println(list.getClass().getSimpleName()+": Took "+time/1000/1000+" ms to add/remove "+size+" elements");
}
{
long start = System.nanoTime();
List<Integer> list = new ArrayList<Integer>();
for(int i=0;i< size;i++)
list.add(i);
for(int i=0;i< size;i++)
list.remove(0);
long time = System.nanoTime() - start;
System.out.println(list.getClass().getSimpleName()+": Took "+time/1000/1000+" ms to add/remove "+size+" elements");
}
}
}
プリント
IntRingBuffer: Took 31 ms to add/remove 1000000 elements
LinkedList: Took 252 ms to add/remove 1000000 elements
ArrayList: Took 325832 ms to add/remove 1000000 elements
これは、a)それが現在受け入れられているものより優れた解決策であること、b)それを証明するタイミングを与えるので、私ができるならば、このいくつかのアップフォースを与えるでしょう。 – DJClayworth
MySQL、PostgreSQL、Oracle、SQLServer、DB2、Informix、Interbase、Firebird、Ingressなど、JDBCでアクセスできる任意のリレーショナルデータベースです。
軽量のものをお探しの場合は、SQLite's API for Javaをご覧ください。
ありがとう、あなたのコメントですが、私はベクトルや配列のリストのようなオブジェクトを探しています。私はこの問題のために何が最善であるかを知りたい。 – Itzik984
あなたはデータベースは探していませんが、データ構造 – Lacrymology
"FIFOデータベース"のようなものはありません。通常、データベースは、何らかの索引スキームを使用して任意の順序でデータにアクセスできます。各レコードにシーケンス番号を付けて順番に読み取ることで、データベースにFIFOキューを実装できます。これまでに使用したデータベースであれば、それが可能です。
多分簡単な答えは、Pabloによって与えられたものです:任意のリレーショナルデータベースを使用してください。 MySQLやPostgresのような無料のものの一つを選び、それを使って遊んで、彼らが何をするかを学びます。
は、あなたが本当にデータベースを意味していますか?あなたはそのためのArrayListを使用することができますので:
ArrayList<Integer> array = new ArrayList<Integer>();
array.add(3);
array.add(4);
array.add(5); // Appends to the end of this list
int myInt = array.remove(0); // Return first element
あなたが本当にデータベースが必要な場合は、私たちにあなたが何をしたいのかの詳細を与えることができますか?
[編集] お読みください:Java Best Practices – Vector vs ArrayList vs HashSetありがとう!
あなたのコメントを見て、あなたのリストがほしいと思っています。 ArrayListは同期されていないため、パフォーマンスは良好です。同期が必要な場合は、以下を使用できます。List list = Collections.synchronizedList(new ArrayList(...)); – JPelletier
int []のラッパーを使用する方がはるかに効率的です。 –
百万の要素で、intではなくIntegerを使用すると、メモリを非常に素早く噛み砕くことになります。また、 "削除"はあなたにひどいパフォーマンスを与えるでしょう。 Peter Lawreyのソリューションははるかに優れています。 – DJClayworth
あなたがキューを話しているような感じです。 JMSを見て、それがあなたが探しているコンセプトであるかどうかを見てください。このような単純なタスクの大きなツールのように見えるかもしれませんが、永続化された(あなたが望むどんなデータベースにも)機能を提供します。
- 1. 正しいweb-appファイル構造は何ですか?なぜ?
- 2. このwhileループの正しいJSON構造は何ですか?
- 3. JARファイルの正しい内部構造は何ですか
- 4. これはJavaのインターフェイスの正しい構造ですか?
- 5. SortedBiTreeMultimap Javaのデータ構造ですか?
- 6. 子孫関係に使用する最良のデータ構造は何ですか?
- 7. 階層&データ構造Javaで
- 8. どのデータ構造を使用すればいいですか
- 9. ジオコーディングに使用するデータ構造はどれですか?
- 10. 使用するC#データ構造体はどれですか?
- 11. シングルバインディングでStringFormatを使用する正しい構文は何ですか?
- 12. VBScriptでAWKを使用する正しい構文は何ですか?
- 13. CSSで垂直バーを使用する正しい構文は何ですか?
- 14. modulisationを使用するJavaインターフェイスの正しい使い方は何ですか?
- 15. java collectionsデータ構造
- 16. Javaデータ構造リファレンス
- 17. 2つの値を保持するために使用するよいデータ構造は何ですか?
- 18. このデータ形式を表すために使用するデータ構造は何ですか?
- 19. NSErrorを使用してエラーをチェックする正しい構造
- 20. 2次元テーブル構造をメモリに格納するのに適したデータ構造は何でしょうか?
- 21. 2次元配列をJavaで実装するのに最も適したデータ構造は何ですか?
- 22. このデータ構造には何が問題なのですか?
- 23. プールコンテナの最適なデータ構造は何ですか?
- 24. 自己調整データ構造とは何ですか?
- 25. LazyTreeGridStoreModelのデータ構造とは何ですか?
- 26. Objective-Cのデータ構造とは何ですか?
- 27. このデータをデータベースに保存する正しい構文は何ですか?
- 28. どのC#データ構造を使用すべきですか?
- 29. Javaデータ構造を照会する
- 30. データツリーをシミュレートするjavaデータ構造
どのくらいの整数ですか?約10,100,10000,100000000またはそれ以上について – Ishtar
私は約1000000と言うでしょう – Itzik984
以下のコメントによると、あなたは "データベース"を探しているのではなく、データ構造(コレクション)を探しています。 – leonbloy