Как легко скопировать один тип списка в другой тип? - PullRequest
0 голосов
/ 17 декабря 2009

Скажем, я хочу скопировать все элементы списка A в список B. Но элементы в списке A имеют тип ExampleClass, а элементы в списке B - String.

ExampleClass {
    String a;
}

Так как ExampleClass имеет атрибут a, который является строкой, при преобразовании из ExampleClass в строку я хочу, чтобы значение a было возвращено как строка, представляющая ExampleClass. Будет ли toString () сделать это? Какой самый эффективный способ сделать это, не обходя весь список A, преобразовать каждый ExampleClass в String и добавить их в список B?

Ответы [ 4 ]

2 голосов
/ 17 декабря 2009

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

Что касается значимости toString() в этой ситуации, это полностью зависит от вашего класса. Как минимум, в ExampleClass должна быть реализована toString(), потому что реализация по умолчанию выглядит как «ExampleClass @ abc564», что, вероятно, вам вообще не нужно. Кажется, вы хотите использовать значение его поля a.

Итак, подведем итог

for (ExampleClass e: listA){
    listB.add(e.toString());
}

// and in ExampleClass
public String toString(){
   return a;
}

Примечание: если вы переопределите toString(), это будет использоваться везде, где печатается класс, что может быть или не быть проблемой. Для целей цикла преобразования вы можете также использовать метод getA() и использовать его вместо toString().

1 голос
/ 17 декабря 2009

Обратите внимание, что для ответа на один из ваших последних вопросов - toString() не напечатает ничего о полях в вашем классе, если вы не переопределите этот метод и не скажете ему сделать это. Если вы не переопределите его, вывод определяется методом toString () объекта (точный вывод которого не указан API, кроме как «текстовым представлением», но в Sun JRE это полное имя класса в сочетании с хэш-код идентификатора объекта, сам получаемый из адреса памяти, используемого этим объектом).

В целом, мне не нравится полагаться на определенное значение toString () для пользовательского класса, так как он не совсем точно определил, каким должно быть значение, но я, конечно, чувствую, что оно должно быть читаемым человеком. Я бы предпочел использовать явный метод getA() в этом случае.

1 голос
/ 17 декабря 2009

В прошлом я использовал класс TransformedList от Apache Commons. Он не создает копию списка, а украшает список функцией преобразования. В вашем случае ваш Transformer просто вернет значение a из объекта.

Сделайте попытку, если вы обнаружите, что вам не нужна фактическая копия списка.

1 голос
/ 17 декабря 2009

Ваш вопрос касается эффективности ... поэтому я отвечу на него.

Для копирования одного списка в другой, по сути, нет способа сделать это, чем перебрать все элементы на некотором уровне.

Теперь вы сможете уменьшить объем выделяемой памяти и перемещаться, если только захотите скопировать строку в качестве ссылки. Но кто-то на каком-то уровне будет проходить через N элементов, так что это может быть так же легко, как и вы.

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