Клонирование списка - как это делается? - PullRequest
2 голосов
/ 11 мая 2011

Я хочу сделать поверхностную копию списка, возвращаемого вызовом метода (это общедоступный список getScanResults () из Android, см. http://developer.android.com/reference/android/net/wifi/WifiManager.html#getScanResults%28%29). Проблема в том, что clone () не определен в списке интерфейс, но только для конкретных классов, таких как ArrayList - однако я не знаю, что getScanResults () использует для внутреннего использования, поэтому я не могу просто привести его или я ошибаюсь по этому поводу? Затем я подумал о чем-то вроде

anExistingList.add (getScanResults ());

но getScanResults (), кажется, возвращает ноль вместо пустого списка, если нечего возвращать, так что это тоже не вариант. Когда я бы сделал что-то вроде

if(getScanResults() != null)
    anExistingList.add(getScanResults());

возвращаемое значение getScanResults () может измениться между первой строкой кода и второй, поэтому оно может сначала пройти условие «не равно нулю», а затем быть нулевым во второй строке, или я ошибаюсь по этому поводу?

Итак, как мне сделать поверхностную копию возвращаемого значения getScanResults () или просто сформулировать мою цель: получить значение из getScanResults () и убедиться, что оно не меняется, пока я с ним работаю?

Спасибо за любую подсказку :-) (Наверное, я что-то не так понимаю)

Ответы [ 3 ]

1 голос
/ 11 мая 2011

Все коллекции с хорошим поведением имеют конструкторы копирования.Поэтому создайте экземпляр типа списка, который вы хотите, в зависимости от ваших потребностей (например, быстрая индексация или эффективное удаление некоторых элементов).

В этом случае вам придется сделать немного больше, чтобы справиться с неудобствамивозможного нуля.Так что-то вроде этого:

/**
 * @return a copy of the original; an empty list if original is null.
 */
public static <T> List<T> randomAccessibleCopy(List<T> original) {
    return (null == original) 
             ? Collections.<T>emptyList() 
             : new ArrayList<T>(original);
}

Теперь вы можете вызывать этот метод с результатами базового API, который возвращает список.

1 голос
/ 11 мая 2011

Смотрите здесь . java.util.Collections предоставляет статический метод copy для копирования содержимого из одного списка в другой.

0 голосов
/ 11 мая 2011
if(getScanResults() != null)
    anExistingList.add(getScanResults());

должно быть

List x = getScanResults();
if(x != null)
    anExistingList.add(x);

Поскольку метод теперь вызывается только один раз, он не может измениться за это время.

...