2015-03-19 2 views
1

Что мне нужно: Получение элемента Я создал два объекта из класса, который имеет 2 атрибута: id и имя. После того как я создать объект, я установить его ID и добавить объект в ArrayList:Получить элемент по его атрибутам

Variable variable1 = new Variable(); 
variable1.setID(1); 
Variable variable2 = new Variable(); 
variable1.setID(2); 
ArrayList<Variable> varList = new ArrayList<Variable>(); 
varList.add(variable1); 
varList.add(variable2); 

Тогда в моем коде я хочу, чтобы получить элемент, который имеет Id == 1, но я не нашел способ который может вернуть мне объект, предоставив ему атрибут Object.

Есть ли способ, подобный этому: Object o = getObjectByAttribute (Object.id == 1)?

+0

@BijuCD _ "Добавление тега java8 для того, чтобы задать этот вопрос для соответствующего вопроса java8" _ Почему вы добавляете тег java-8? OP не уточнил, что он использует java 8 или что он хочет ответить на java 8. Если вы хотите предоставить java 8, не стесняйтесь добавлять его и точно указывать в своем ответе, но не редактируете вопрос. для этого. Откат вашего редактирования. – user2336315

+0

Да, речь идет не о java8, а о коде. – Anatch

ответ

1

Вы можете использовать Collections.binarySearch() и обычай Comparator

javadoc

EDIT: фрагмент кода:

Comparator<Variable> comparator = new Comparator<Variable>() { 
    public int compare(Variable o1, Variable o2) { 
     return Integer.compare(o1.getID(), o2.getID()); 
    } 
}; 
Collections.sort(varList, comparator); 
Variable key = new Variable(); 
key.setID(1); 
int index = Collections.binarySearch(varList, key, comparator); 
+0

запомнить 'sort' коллекцию перед запуском' binarySearch' –

1

Если вы используете java8, фильтры (в лямбда-выражении) является хороший вариант.

Stream<Variable> outputList = varList.stream().filter(val -> val.getId() ==1); 

outputList будет содержать только переменные объекты с Id 1. Первый элемент может быть взят из этого списка, если он не пуст.

Ref: http://zeroturnaround.com/rebellabs/java-8-explained-applying-lambdas-to-java-collections/

+0

Вы можете хотя бы немного изменить свой ответ, чтобы он применился к случаю использования OP ... и завершите его, то есть получите правильный экземпляр 'Variable' в конец. Это так неполно ... – user2336315

+0

@ пользователь2336315 модифицировано. Благодарю. –

+0

Downvote удален, хотя это поток, а не список ... Вы также должны показать, как получить этот элемент из списка. – user2336315

1

Есть ли способ, как это: Object = о getObjectByAttribute (Object.id == 1)?

Нет, но его легко создать. Создание интерфейса Function, что из объекта типа Т дают свойство типа U.

interface Function<T, U> { 
    U apply(T t); 
} 

Затем метод:

public static <T, U> T getObjectByAttribute(List<T> objects, Function<T, U> fromAttribute, U attributeResearched) { 
    for(T obj : objects) { 
     if(fromAttribute.apply(obj).equals(attributeResearched)) { 
      return obj; 
     } 
    } 
    return null; 
} 

и как назвать:

Variable v = getObjectByAttribute(varList, new Function<Variable, Integer>() { 
         @Override 
         public Integer apply(Variable variable) { 
          return variable.id; 
         } 
       }, 1); 
Смежные вопросы