2012-05-07 4 views
0

インデックス付き検索のための構造のような単純なデータベースが必要です。これはアプレットで使用されるので、私は追加の組み込みデータベースjarを使いたくありません。インデックス型コレクションフィルタリングのようなテーブル

合計すると: 私は、生物学で説明しようとします。たとえば、学生テーブル:

Students 
------------------ 
Score 
Gender 
Name 

私は全表スキャンを行う見つけSCORE > 40 AND SCORE < 80 AND GENDER = MALE ソリューションをフィルタリングします。しかし、私はTreeMapのようなソリューションを探しています。

私は、TreeMapを使用してパーティション化のような単純なソリューションを作成しました。

package multikey; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.SortedMap; 
import java.util.TreeMap; 


public class MultiKey { 




    public MultiKey() { 

     final Integer MALE = 1; 
     final Integer FEMALE = 2; 

     List<Student>         students = new ArrayList<Student>(); 
     TreeMap<Integer, TreeMap<Integer, List<String>>> table; 

     students.add(new Student(80, MALE, "John")); 
     students.add(new Student(80, FEMALE, "Monica")); 
     students.add(new Student(70, MALE, "Michael")); 
     students.add(new Student(60, MALE, "Brad")); 
     students.add(new Student(60, FEMALE, "Angelina")); 
     students.add(new Student(50, MALE, "Steve")); 
     students.add(new Student(40, MALE, "Alex")); 

     table = new TreeMap<Integer, TreeMap<Integer, List<String>>>(); 

     for (Student student : students) { 
      Integer      score  = student.score; 
      Integer      gender = student.gender; 
      TreeMap<Integer, List<String>> genderMap; 
      List<String>     names; 

      if ((genderMap = table.get(score)) == null) { 
       genderMap = new TreeMap<Integer, List<String>>(); 
       table.put(score, genderMap); 
      } 

      if ((names = genderMap.get(gender)) == null) { 
       names = new ArrayList<String>(); 
       genderMap.put(gender, names); 
      } 

      names.add(student.name); 
     } 

     // 50 - 70 arasında alan erkekler 
     SortedMap<Integer, TreeMap<Integer, List<String>>> students5070 = table.subMap(50, 71); 
     List<String>          filtered  = new ArrayList<String>(); 

     for (Integer score : students5070.keySet()) { 
      filtered.addAll(students5070.get(score).get(MALE)); 
     } 

     System.out.println(filtered); 
    } 



    public static void main(String[] args) { 

     new MultiKey(); 
    } 




    public class Student { 




     private int gender; 
     private String name; 
     private int score; 




     public Student(int score, int gender, String name) { 

      this.score = score; 
      this.gender = gender; 
      this.name = name; 
     } 




     public int getGender() { 

      return gender; 
     } 



     public String getName() { 

      return name; 
     } 




     public int getScore() { 

      return score; 
     } 




     @Override 
     public String toString() { 

      return name; 
     } 
    } 
} 
+0

いくつのレコードがありますか? – sjr

+0

最大10000レコード。 –

+0

毎回リニアスキャンでそれらをフィルタリングすることができます。 10,000は非常に小さいリストです。レコードの数が10倍であっても、他のどのソリューションより速いでしょう。あなたは10^5のレコードを持っているとしましょう。それぞれのレコードは、1000命令(高い見積もり)で一致するかどうかを判断します.1GHzプロセッサは約0.1秒でこれを行います。すぐに十分速くなければなりませんか? – sjr

答えて

1

テーブルが必要な場合は、guava tablesが参考になる場合があります。 SQLのような構文がもっと必要な場合...純粋なhava SQLデータベースのようなものを避けることはできません。HSQLDB

関連する問題