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