Поддерживает ли список, возвращаемый из Arrays.asList, тот же порядок, что и у исходного массива? - PullRequest
14 голосов
/ 11 февраля 2011

У меня есть ArrayList, который я повторяю несколько раз, и похоже, что он не поддерживает порядок итерации.Я посмотрел глубже, и кажется, что пользовательский тег итератора, который был написан для этой итерации (кем-то другим), сначала берет переданный в ArrayList и использует Arrays.asList, чтобы связать его с коллекцией Object [] перед итерацией.Порядок итерации теряется?Это ожидается с Arrays.asList?

РЕДАКТИРОВАТЬ:

Вот что делает операция с исходной коллекцией, переданной в тег итератора:

if(collection.getClass().isArray()) {
    iterator = Arrays.asList((Object[]) collection).iterator();
} else if(collection instanceof Collection) {
    iterator = ((Collection) collection).iterator();
} else if(collection instanceof Iterator) {
    iterator = (Iterator) collection;
} else if(collection instanceof Map) {
    iterator = ((Map) collection).entrySet().iterator();
}

Ответы [ 3 ]

10 голосов
/ 11 февраля 2011

Список по-прежнему поддерживается исходным массивом, поэтому элементы должны отображаться в том же порядке, что и в массиве.

Также обратите внимание, что asList является универсальным методом, поэтому Arrays.asList(T[]) вернет List<T>.

Что касается другого направления, List s toArray

Возвращает массив, содержащий все элементы в этом списке в надлежащем последовательность (от первого до последнего элемента).

Есть два метода toArray. Первый возвращает Object[], второй принимает массив в качестве аргумента и возвращает массив того же типа.

Нечто подобное не редкость, используя в качестве примера массив String:

String[] y = x.toArray(new String[0]);

(Этот пример взят из JavaDoc для List<E>)

2 голосов
/ 11 февраля 2011

Возможно, где итерация отбрасывается, если collection является картой

 else if(collection instanceof Map) {
    iterator = ((Map) collection).entrySet().iterator();
}

Если collection определенно является HashMap , порядок элементов коллекции действительно выбрасывается в окно.

Если collection является TreeMap , оно должно поддерживать порядок коллекции на основе сортировки. Однако, если вы сделаете TreeMap из массива сопоставимых объектов, вы не должны ожидать, что массив и TreeMap будут иметь одинаковый порядок, поскольку TreeMap будет сортировать содержимое массива.

И вы также можете получить какой-нибудь другой Collection, который будет копаться с порядком, как HashSet , PriorityQueue и т. Д.

Однако, если collection никогда не является картой и всегда массивом, Arrays.asList должен поддерживать порядок. Мое предположение состоит в том, что ваши проблемы лежат либо вне вашего фрагмента кода, либо в одном из случаев, кроме того, где вы передали массив.

0 голосов
/ 11 февраля 2011

Вы можете сделать это более общим, заменив Collection на Iterable.

} else if(collection instanceof Iterable) {
    iterator = ((Iterable) collection).iterator()

Примечание: примитивные массивы похожи на int[].class.isArray() == true, но их нельзя использовать с Object[]

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