Гарантирован ли метод коллекции Java retainAll () оставить порядок списка, который он изменяет, без изменений? - PullRequest
3 голосов
/ 20 сентября 2019

Может ли это зависеть от того, какой объект коллекции использует retainAll?Я использую списки строк.

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

Я даже нашел примеры кода реализации функции retainAll, которые указывали бы, что порядок не затрагивается.Но, как я понимаю, эти примеры могут не совсем соответствовать тому, как стандартный метод закодирован в загруженном пакете Java.Судя по моим собственным тестам, использование метода также показывает, что он остается в порядке.Но я хотел быть более уверенным, так как тест, который я делаю, основан именно на том, чтобы список оставался в порядке.

Точнее, я хочу, чтобы эта функция была верной и надежной.

 /**
 * This function takes the expected list and verifies it is contained within the actual list, in the expected order
 * @param expectedList {@link List} List ordered as it should be to pass criteria
 * @param actualList {@link List} List ordered as it exists in the product
 * @return {@link Boolean} returns true when the expectedList is ordered within the actualList correctly
 */
static boolean verifyOrder(List<String> expectedList, List<String> actualList)
{
    boolean ordered = false

    if (expectedList == actualList)
        ordered = true
    else
    {
        actualList.retainAll(expectedList)
        if (actualList == expectedList)
            ordered = true
    }
    return ordered
}

Ответы [ 2 ]

3 голосов
/ 21 сентября 2019

Для справки, предположим, что вызов:

list.retainAll(coll)

В противном случае вопрос не имеет смысла, учитывая, что list - это изменяемая коллекция и та, которая имеет заданный порядок.

Гарантирован ли метод коллекции Java retainAll () оставить порядок списка, который он изменяет, без изменений?

В спецификации явно сказано, что удаляет элементыиз list, которого нет в coll, поэтому вопрос о порядке зависит от того, указан ли метод remove для сохранения порядка.

Поскольку вы сказали ", оставьте порядок из list" тогда ответ: Да

Но вы также сформулировали это " Является ли Java collection метод retainAll () ", такесли list не List, а какой-либо другой тип коллекции, то ответ - Нет, потому что не все типы коллекции гарантируют порядок.

Может ли это зависеть от того, какой объект коллекции использует retainAll?

Так как list этоТот, который использует метод, затем: Нет
Ну, если предположить, что равен a List, но это уже получено.

Есливы имели в виду coll как "тот, который использует метод", тогда: Нет
Однако производительность зависит от типа сбора coll, потому что реализация использует coll.contains() для проверки совпадений, так что вы получите намного лучшую производительность, если coll будет Set.

0 голосов
/ 21 сентября 2019

1) Метод retainAll() определяется в интерфейсе Collection, а не в List.В коллекции в основном нет порядка.Например, Set является коллекцией и имеет этот метод тоже.Но в Set нет порядка (если только вы не используете какую-то особенную реализацию Set).Порядок определяется только для List.Вот почему ваш вопрос имеет смысл только для List, но не для Collection в целом.

2) Если мы имеем в виду List: спецификация не требует сохранения порядка элементов, если retainAll вызывается List.Определение JLS очень расплывчато: JLS говорит о List, что это упорядоченная коллекция ... Пользователь может получить доступ к элементам по их целочисленному индексу .Но нет ни слова о сохранении порядка при каких-либо манипуляциях.Я действительно ожидал бы, что порядок должен быть сохранен, но JLS этого не требует.Поэтому формально не стоит ожидать, что порядок даже в списке будет сохранен.

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