Нахождение всех объектов, которые имеют данное свойство в наборе [дубликат]

Переопределить body-color. В CSS цвет текста элемента контролируется с помощью смутно названного свойства color. Таким образом, имя переменной начальной загрузки происходит от этого.

85
задан Ciro Santilli 新疆改造中心法轮功六四事件 23 March 2015 в 16:40
поделиться

11 ответов

Вы могли записать метод, который берет экземпляр интерфейса, который определяет check(Cat) метод, где тот метод может быть реализован с любой проверкой свойства, Вы хотите.

Еще лучше, сделайте это универсальным:

public interface Checker<T> {
    public boolean check(T obj);
}

public class CatChecker implements Checker<Cat> {
    public boolean check(Cat cat) {
        return (cat.age == 3); // or whatever, implement your comparison here
    }
}

// put this in some class
public static <T> Collection<T> findAll(Collection<T> coll, Checker<T> chk) {
    LinkedList<T> l = new LinkedList<T>();
    for (T obj : coll) {
         if (chk.check(obj))
             l.add(obj);
    }
    return l;
}

, Конечно, как другие люди говорят, это - то, для чего были сделаны реляционные базы данных...

45
ответ дан David Z 24 November 2019 в 08:10
поделиться

Вот идея для класса искателя, который Вы могли параметризовать с определенными значениями, которые Вы хотите искать.

Вы могли пойти далее и сохранить названия свойств также, вероятно, в Карте с требуемыми значениями. В этом случае Вы использовали бы отражение о классе CAT для вызова соответствующих методов, учитывая имена свойства.

public class CatSearcher {

  private Integer ageToFind = null;
  private String  foodToFind = null;

  public CatSearcher( Integer age, String food ) {
    this.ageToFind = age;
    this.foodToFind = food;
  }

  private boolean isMatch(Cat cat) {
    if ( this.ageToFind != null && !cat.getAge().equals(this.ageToFind) ) {
       return false;
    }
    if ( this.foodToFind != null && !cat.getFood().equals(this.foodToFind) {
       return false;
    }
    return true;
  }

  public Collection<Cat> search( Collection<Cat> listToSearch ) {
    // details left to the imagination, but basically iterate over
    // the input list, call isMatch on each element, and if true
    // add it to a local collection which is returned at the end.
  }

}
0
ответ дан Dave Costa 24 November 2019 в 08:10
поделиться

Вы могли хранить те объекты на базе данных. Если Вы не хотите издержки полноценного сервера базы данных, можно использовать встроенный как HSQLDB. Тогда можно использовать, в спящем режиме или BeanKeeper (более простой использовать) или другой ORM для отображения объектов на таблицы. Вы продолжаете использовать модель OO и получаете усовершенствованное устройство хранения данных и запросы преимуществ от базы данных.

0
ответ дан Cesar 24 November 2019 в 08:10
поделиться

Вы могли попробовать часть общего кода в Apache проект палаты общин. Эти Наборы подпроект предоставляет код для нахождения объектов, которые соответствуют конкретному Предикату, а также большое количество предикатов (равняется, пустой указатель, instanceof, и т.д.). подпроект BeanUtils позволяет Вам делать предикаты, которые тестируют свойства бобов.

Использование класс CollectionUtils для поиска в наборе. Существует несколько методов для этого, но проверяют выбор () метод, в частности. Используйте следующие классы, чтобы создать предикаты или записать Ваше собственное: Предикат , PredicateUtils, BeanPredicate.

Это является все иногда немного громоздким, но по крайней мере это универсально!:-)

1
ответ дан Rich Dougherty 24 November 2019 в 08:10
поделиться

Можно использовать что-то как JoSQL и записать 'SQL' против наборов: http://josql.sourceforge.net/

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

1
ответ дан duwanis 24 November 2019 в 08:10
поделиться

Много походит на что-то, для чего Вы использовали бы LINQ в.NET

, В то время как еще нет никакой "реальной" реализации LINQ для Java, Вы могли бы хотеть взглянуть на Вопрос , который мог сделать то, что Вы описываете достаточно легко.

1
ответ дан Eric Petroelje 24 November 2019 в 08:10
поделиться

Я предлагаю использовать Jxpath, он позволяет Вам делать запросы на графах объектов как будто это где xpath как

JXPathContext.newContext(cats).
     getValue("//*[@drinks='milk']")
11
ответ дан flybywire 24 November 2019 в 08:10
поделиться

Я использовал Google Collections (теперь названный Гуава ) для этого вида проблемы. Существует класс под названием Iterables, который может взять интерфейс под названием Предикат как параметр метода, который действительно полезен.

Cat theOne = Iterables.find(cats, new Predicate<Cat>() {
    public boolean apply(Cat arg) { return arg.age() == 3; }
});

Проверка это здесь !

55
ответ дан 3 revs, 3 users 63% 24 November 2019 в 08:10
поделиться

Попробуйте API наборов свободного городского населения:

List<Cat> bigList = ....; // master list

Collection<Cat> smallList = CollectionUtils.select(bigList, new Predicate() {
    public boolean evaluate(Object o) {
        Cat c = (Cat)o;
        return c.getFavoriteFood().equals("Wiskas") 
            && c.getWhateverElse().equals(Something);
    }
});

, Конечно, Вы не должны использовать анонимный класс каждый время, Вы могли создать реализации эти Predicate интерфейс для наиболее часто используемого searchs.

62
ответ дан bountiful 24 November 2019 в 08:10
поделиться

Опять же, с API общих коллекций: Вы получаете код типа «проверка», когда реализуете предикат отдельно: -

public class CatPredicate implements Predicate {

    private int age; 


    public CatPredicate(int age) {
        super();
        this.age = age;
    }


    @Override
    public boolean evaluate(Object o) {
        Cat c (Cat)o;
        return c.getAge()==this.age;
    }

}

, который используется как: -

CollectionUtils.filter(catCollectionToFilter, new CatPredicate(3))
5
ответ дан 24 November 2019 в 08:10
поделиться

Решения, основанные на предикатах, фильтрах и пользовательских итераторах/сравнениях, хороши, но они не дают аналога с индексом базы данных. Например: Я хочу искать коллекцию кошек разными способами: по полу и возрасту и по возрасту, поэтому это выглядит как два индекса: 1) [пол, возраст] 2) [возраст]. Значения, к которым обращаются эти индексы, можно было бы хэшировать, чтобы реализовать быстрый поиск, не итерируя всю коллекцию. Есть ли где-нибудь такое решение?

.
1
ответ дан 24 November 2019 в 08:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: