Добавление элемента в ArrayList по индексу запрещено интерфейсом Collection

Я сортирую ArrayList объектов, которые включают объекты календаря. Я хочу отсортировать ArrayList по возрастанию или по убыванию на основе параметра, используемого при вызове метода сортировки.

@Override
public Collection<TwitterMessage> sortByTime(boolean newestFirst) {
    Collection<TwitterMessage> results = new ArrayList<>();
    for (int i = 0; i < tweets.size(); i++) {
        TwitterMessage tweet1 = tweets.get(i);
        TwitterMessage tweet2 = tweets.get(i+1);
        if(newestFirst = true) {
            if(tweet1.dato().compareTo(tweet2.dato()) >= 0) {
                results.add(0, tweet1);
            }
        }
        else {
            if(tweet1.dato().compareTo(tweet2.dato()) <= 0) {
                results.add(0, tweet1);
            }
        }
    }
    return results;
}

Я считаю этот метод правильным. Проблема в том, что возвращаемый тип указан в интерфейсе на основе интерфейса коллекции. Я получаю ошибку компиляции на

results.add(0, tweet1);

line, потому что интерфейс Collection разрешает только results.add(object), а не results.add(int, object), как это делает ArrayList. Есть ли способ добавить объект в индекс, даже если его нет в интерфейсе коллекции?


person user1736049    schedule 20.02.2014    source источник
comment
Кроме того, if(newestFirst = true), безусловно, не то, что вы ищете. Должно быть if(newestFirst == true), а еще лучше if(newestFirst).   -  person Alexis C.    schedule 20.02.2014


Ответы (1)


Просто объявите свою переменную как список:

List<TwitterMessage> results = new ArrayList<>();

Чтобы отсортировать список, вы должны использовать Collections.sort(), передав пользовательский компаратор в качестве аргумента.

person JB Nizet    schedule 20.02.2014
comment
Спасибо. Почему бы не сделать так, как я это реализовал? Я очень хочу узнать причины, лежащие в основе наилучшей практики. - person user1736049; 20.02.2014
comment
Потому что то, как вы это реализовали, не компилируется. Чтобы иметь возможность вызывать метод, относящийся к типу List, ваша переменная должна быть объявлена ​​как List (или любой из его подклассов), в противном случае компилятор не может знать, что тип коллекции — List. - person JB Nizet; 20.02.2014
comment
Извините, я хотел спросить, почему я должен использовать Collections.sort(). Я объявил переменную результатов как ArrayList, и теперь она компилируется. - person user1736049; 20.02.2014
comment
Потому что Collections.sort() делает то, что вы хотите: сортирует список. Ваш метод не сортирует список. Попробуй это. - person JB Nizet; 20.02.2014
comment
Зачем выполнять сортировку самостоятельно, если можно использовать встроенный метод, который сделает это за вас? ;) - person Alexis Leclerc; 20.02.2014