2015-02-17 3 views
0

У меня есть следующий список:установлен первый элемент списка

private String[] myArray = new String[]{"A","B","C"} ; 
List myList = new ArrayList(); 
for (int i = 0; i < myArray.length; i++) { 
      myList.add(myArray[i]); 
} 

Там это метод, который возвращает элемент MyList

String returnValue=myMethod(); 

ReturnValue может быть А или В или С

returnValue должен быть первым элементом в списке

myList.add(0, returnValue); 

Проблема, если ReturnValue = "В", MyList становится { "Б", "В", "С"}.

Я мог бы явно удалить returnValue и добавить его снова в myList. Но это кажется излишним, может ли кто-нибудь предложить лучший подход к дизайну.

Мой требуемый результат будет { «B», «A», «C»}

+1

Какой результат вы хотите получить? –

ответ

4

Насколько я понял, вы хотите returnValue стать первым элементом List, то есть изменить заказ. Это может быть достигнуто с помощью:

Collections.swap(myList, 0, myList.indexOf(returnValue)); 

Поскольку это не использует добавления, ни удаления, это позволяет упростить весь код:

List<String> myList = Arrays.asList("A","B","C"); 
String returnValue=myMethod(); 
Collections.swap(myList, 0, myList.indexOf(returnValue)); 

Обратите внимание, что это меняет порядок остальных элементов. Если вы хотите сохранить порядок всех элементов, но тот, который вы перейти к передней части списка (например, remove с последующим add будет делать), вам необходимо использовать rotate:

List<String> myList = Arrays.asList("A","B","C"); 
String returnValue=myMethod(); 
Collections.rotate(myList.subList(0, myList.indexOf(returnValue)+1), 1); 

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

+0

Хороший ответ +1. Но просто swap() работает отлично. Он rotate(), который изменит индексы. –

+0

@Ravi Thapliyal: 'rotate' изменит индексы, но сохранит * относительный * порядок элементов, который имеет отношение к положению предыдущего элемента. С 'swap' он перейдет в прежнее положение нового первого элемента, таким образом, может иметь другое положение относительно всех остальных остальных элементов. С помощью 'rotate' он переместится во второе положение, таким образом, останется перед всеми остальными элементами. – Holger

+0

Не 'rotate' избыточно, когда вы можете использовать' LinkedList' и удалять/добавлять элемент наиболее эффективным способом? – simurg

0

Если я хорошо понимаю вашу проблему, вы должны использовать метод set(int index, E element) заменить данный элемент в списке

1

List.add(index, element) не заменяет первый элемент в вашем List, он вставляет и, таким образом, он перемещает все следующие элементы. Вы бы в конечном итоге с 4 записей в списке:

{RETURNVALUE, "A","B","C"} 

Там также заменить вариант: List.set(index, element).При том, что вы в конечном ио 3 записей в списке:

{RETURNVALUE,"B","C"} 

Если вы хотите сохранить ваши List все сортируется, есть простой метод

Collections.sort(mylist); 

утилита, которая сортирует свою коллекцию, в отношении его element compareTo(), который был бы простым заказом String в вашем случае.
Если ReturnValue является B и вы вставили элемент, вы бы в конечном итоге с

{"A","B","B","C"}