Мне нужна простая база данных, такая как структура для индексированного поиска. Он будет использоваться в апплете, поэтому я не хочу использовать дополнительный встроенный баннер базы данных.Таблица, подобная индексированной фильтрации коллекции
Сумма: Я пытаюсь объяснить с помощью анологии. Для экземпляра студентов таблицы:
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 - чрезвычайно маленький список. Вероятно, будет быстрее, чем любое другое решение, если у вас даже 10x количество записей. Скажем, у вас есть 10^5 записей, каждая запись занимает, скажем, 1000 инструкций (высокая оценка), чтобы определить, соответствует ли она, процессор 1 ГГц собирается сделать это примерно за 0,1 секунды. Должно быть достаточно быстро? – sjr