2013-04-15 2 views
2

Каков самый быстрый способ получить выделенные объекты из массива?java новый массив, где значение объекта true, mysql 'where' синтаксис в массиве

MyObject[] objects = new MyObject[]{new MyObject(true), new MyObject(false)}; 
MyObject[] selectedObjects = ??? 

Есть более быстрый способ, чем:

ArrayList<MyObject> selObjectsList = new ArrayList<MyObject>(); 
for(MyObject obj : objects){ 
    if(obj.isSelected()){ 
     selObjectsList.add(obj); 
    } 
} 
selectedObjects = selObjectsList.toArray(new MyObject[0]); 

Это много линий для простой операции, есть ли более короткая операция делать то же самое?

+0

Это может помочь http://stackoverflow.com/questions/2082449/how-to-filter-an-array-in-java – JRR

+0

Вы можете сделайте код более аккуратным, уменьшив количество требуемых строк, но вы не найдете ничего быстрее, чем O (n) -терация. – Perception

ответ

3

В стандартных библиотеках нет (фундаментального) более аккуратного способа сделать это. Но есть множество сторонних библиотек, которые поддерживают filter или predicate. Google Collections Приходит на ум. И я также хорошо слышал о LambdaJ. Надеюсь, все будет улучшено с помощью Java 8!

С LambdaJ это может выглядеть примерно так:

select(myList, having(on(MyObject.class).isSelected())); 

Редактировать Я интерпретировал «быстрый» как кратчайшее количество строк. Если бы это была производительность, о которой вы думали, этот ответ может оказаться неприемлемым.

+0

+1 при объяснении толкования и оговорке. –

+1

Я использую это несколько раз в своем коде, но он всегда выполняется только один раз, поэтому большой O не имеет значения. Теперь код становится более читаемым;) – Jetse

0

К сожалению, нет. Если вы используете ArrayList, который является линейным списком, то вы фактически вынуждаете линейный поиск.

Если вы хотите улучшить поиск, то вы можете использовать что-то вроде Карты, что позволит быстрее искать, но вам придется использовать интеллектуальный метод установки ключей. Например, если вы искали заказы, вы можете использовать номер заказа в качестве ключа.

0

Используйте карту.

Map<Boolean, List<MyObject>> someMap; 

Затем вы можете сделать следующее, чтобы получить список выбранных «MyObjects».

someMap.get(true); 

И заселить ...

someMap.put(myObjectInstance.isSelected(), myObjectInstance); 

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

  • Нет связанных вопросов^_^