2011-01-18 16 views
0

整数をデータ構造体に保存したいのですが、整数の数字 がわからない場合があります。 私はデータベースをFIFOにしたいと思っています。 この目的には何が最適ですか?javaで使用する正しいデータ構造は何ですか?

+0

どのくらいの整数ですか?約10,100,10000,100000000またはそれ以上について – Ishtar

+0

私は約1000000と言うでしょう – Itzik984

+0

以下のコメントによると、あなたは "データベース"を探しているのではなく、データ構造(コレクション)を探しています。 – leonbloy

答えて

7

データベースを使用する以外にも、いくつかの中間子がある場合は、それらをプレーンファイルに書き込むことができます。プレーンファイルは順序を保持しますが、エントリを削除すると高価になる可能性があります。

プレーンファイルを使用して約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 
+2

これは、a)それが現在受け入れられているものより優れた解決策であること、b)それを証明するタイミングを与えるので、私ができるならば、このいくつかのアップフォースを与えるでしょう。 – DJClayworth

1

MySQL、PostgreSQL、Oracle、SQLServer、DB2、Informix、Interbase、Firebird、Ingressなど、JDBCでアクセスできる任意のリレーショナルデータベースです。

軽量のものをお探しの場合は、SQLite's API for Javaをご覧ください。

+0

ありがとう、あなたのコメントですが、私はベクトルや配列のリストのようなオブジェクトを探しています。私はこの問題のために何が最善であるかを知りたい。 – Itzik984

+0

あなたはデータベースは探していませんが、データ構造 – Lacrymology

1

"FIFOデータベース"のようなものはありません。通常、データベースは、何らかの索引スキームを使用して任意の順序でデータにアクセスできます。各レコードにシーケンス番号を付けて順番に読み取ることで、データベースにFIFOキューを実装できます。これまでに使用したデータベースであれば、それが可能です。

多分簡単な答えは、Pabloによって与えられたものです:任意のリレーショナルデータベースを使用してください。 MySQLやPostgresのような無料のものの一つを選び、それを使って遊んで、彼らが何をするかを学びます。

+0

私は質問の書き方と間違えるかもしれませんが、私は1000000の整数を保存する方法について考えていました。 – Itzik984

+0

お待ちください、あなたは "データベース"または "データ構造"をお探しですか? – Jay

+0

ああ、他の人があなたの本当の質問への回答を投稿しました。 – Jay

1

は、あなたが本当にデータベースを意味していますか?あなたはそのための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ありがとう!

+0

あなたのコメントを見て、あなたのリストがほしいと思っています。 ArrayListは同期されていないため、パフォーマンスは良好です。同期が必要な場合は、以下を使用できます。List list = Collections.synchronizedList(new ArrayList(...)); – JPelletier

+0

int []のラッパーを使用する方がはるかに効率的です。 –

+0

百万の要素で、intではなくIntegerを使用すると、メモリを非常に素早く噛み砕くことになります。また、 "削除"はあなたにひどいパフォーマンスを与えるでしょう。 Peter Lawreyのソリューションははるかに優れています。 – DJClayworth

0

あなたがキューを話しているような感じです。 JMSを見て、それがあなたが探しているコンセプトであるかどうかを見てください。このような単純なタスクの大きなツールのように見えるかもしれませんが、永続化された(あなたが望むどんなデータベースにも)機能を提供します。

関連する問題