Запрос структуры данных Java - PullRequest
3 голосов
/ 10 апреля 2009

Есть ли способ выполнения SQL-подобных запросов или фильтрации в структурах данных Java?

Я хочу фильтровать объекты в ArrayList и HashMap по полям объектов, содержащихся внутри.

Ответы [ 6 ]

5 голосов
/ 10 апреля 2009

Вам может понравиться Quaere , который является довольно богатым языком запросов для графов объектов Java:

Integer[] numbers={5, 4, 1, 3, 9, 8, 7, 2, 0};
Iterable<Integer> lowNumbers=
    from("n").in(numbers).
    where(lt("n",5).
    select("n");
4 голосов
/ 10 апреля 2009

Нет стандартного языка, похожего на SQL, но коллекции Apache commons имеют a фильтр метод, который будет делать то, что вы хотите. Не слишком сложно накатить свой,

public <T> Collection<T> filter (Collection<T> c, Condition<T> condition) {
  ArrayList<T> list = new ArrayList<T>():
  for (T t: c){ 
        if (condition.isSatisfied(t)) { list.add(t); } 
  } 
  return list;
 }

public interface Condition<T> {
   public boolean isSatisfied(T t);
 }
3 голосов
/ 10 апреля 2009

Канонический способ - просто перебрать структуру данных и вставить нужные объекты в новый. К сожалению, в Java нет списочных или первоклассных функций. Но мы можем смоделировать их, используя такую ​​библиотеку, как Функциональная Java :

import fj.F;
import fj.data.List;
import static fj.data.List.list;
import static fj.pre.Show.listShow;
import static fj.pre.Show.stringShow;

List<String> myList = list("one", "two", "three").filter(
  new F<String, Boolean>() {
    public Boolean f(String s) {
      return s.contains("e");
    }
  });

listShow(stringShow).print(myList);

Это напечатает ["one", "three"] на стандартный вывод.

3 голосов
/ 10 апреля 2009

Да и нет.

Нет, не с синтаксисом, похожим на SQL.

Да, с функтором фильтра. В частности, обратите внимание на функцию Apache Commons Collections, CollectionsUtils.filter (), которая применяет объект Predicate к коллекции.

Вы пишете Предикат, а остальные Apache заботятся об остальном.

1 голос
/ 10 апреля 2009

Существует ряд решений для этого, использующих XPath или XQuery. Для начала взгляните на Jaxen .

0 голосов
/ 11 апреля 2009

Одним из довольно экстремальных решений может быть использование какого-либо ORM для сопоставления ваших объектов Java с реальной базой данных SQL, а затем использование реального SQL или языка, похожего на SQL, такого как HQL Hibernate, для точного запроса ваших объектов так, как вам нужно. .

Конечно, я бы серьезно подумал, что если бы я действительно планировал сохранить объекты в базе данных, так как в противном случае это излишне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...