2012-05-07 6 views
0

Мне нужна простая база данных, такая как структура для индексированного поиска. Он будет использоваться в апплете, поэтому я не хочу использовать дополнительный встроенный баннер базы данных.Таблица, подобная индексированной фильтрации коллекции

Сумма: Я пытаюсь объяснить с помощью анологии. Для экземпляра студентов таблицы:

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

ответ

1

Если все, что вам нужно, это таблица, guava tables может помочь вам, если только в качестве ссылки. Если вам нужно больше SQL, как синтаксис ... Я не думаю, что вы можете избежать использования чего-то вроде чистой базы данных hava SQL, например HSQLDB

Смежные вопросы