2016-01-11 4 views
1

У меня есть класс SomeClass со статическим членом myMapenter code here который имеет форму HasmMap<String,ArrayList<SomeOtherClass>>, которая де-сериализуется из файла.Как правильно вернуть часть ArrayList в Java?

У меня есть метод

public ArrayList<SomeOtherClass> getList(final String key, final int N) 

, который, как предполагается, для поиска key на карте и возвращать первые N элементов соответствующего ArrayList, или все дело, если в списке есть <= N элементов. Как я должен реализовать TODO строку ниже:

public ArrayList<SomeOtherClass> getList(final String key, final int N) 
{ 
    ArrayList<SomeOtherClass> arr = myMap.get(key); 
    if (arr == null) return null; 

    if (arr.size() <= N) 
    { 
     return arr; 
    } 
    else 
    { 
     // TODO: return first N elements 
    } 
} 

сделать это эффективно, т.е. без создания ненужных копий в памяти, а на самом деле возвращаются правильные данные?

+1

Существует метод 'subList'. Вы можете использовать его. –

ответ

8

Создайте подсписку с Lists subList method.

Возвращает представление части этого списка между указанным fromIndex, inclusive и toIndex, исключительным.

Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращенном списке отражаются в этом списке и наоборот.

Начать с индекса 0 (включительно начальный индекс) и заканчивать на индекс N (эксклюзивный конечный индекс).

return arr.subList(0, N); 

Это не копирует элементы в новый список; он возвращает вид списка поверх существующего списка.

+0

Я получаю 'java.util.ArrayList $ SubList нельзя отбрасывать в java.util.ArrayList'. Я могу заменить 'return arr.subList (0, N);' с 'return new ArrayList arr.subList (0, N);' но тогда я бы создал копию, верно? –

+0

Это потому, что 'List', возвращаемый' subList', не является 'ArrayList'. Вы можете вернуть свой метод 'List' вместо' ArrayList'. Кроме того, вы можете создать 'ArrayList' из подсписок и вернуть его, но это потребует копирования. – rgettman

Смежные вопросы