Как я могу переопределить метод toString ArrayList в Java?

Я хотел бы иметь свою собственную реализацию метода toString() для ArrayList в Java. Однако я не могу заставить его работать, хотя я добавил свой toString() в класс, содержащий ArrayList.

@Override
public String toString() {
    String result = "+";
    for (int i = 0; i < list.size(); i++) {
        result += " " + list.get(i);
    }
    return result;
}

когда я вызываю свой ArrayList вот так list.toString(), Я все еще получаю представление по умолчанию. Я что-то упускаю?

6 ответов


вы должны сделать что-то вроде

public static String listToString(List<?> list) {
    String result = "+";
    for (int i = 0; i < list.size(); i++) {
        result += " " + list.get(i);
    }
    return result;
}

и передать список в качестве аргумента listToString(). Вы can технически продлить ArrayList (либо с анонимным классом, либо с конкретным) и реализовать toString себя, но здесь это кажется ненужным.


ArrayList<String> list = new ArrayList<String>()
{
    private static final long serialVersionUID = 1L;

    @Override public String toString()
    {
        return super.toString();
    }
};

вы не можете переопределить toString метод ArrayList1. Вместо этого, вы можете использовать служебный класс, который преобразует ArrayList до String как вы хотите/нужно. Другой альтернативой было бы использование Arrays.deepToString(yourList.toArray()).

используя Java 8, это можно сделать очень легко:

//List<String> list
System.out.println(String.join(",", list));

или List<Whatever>:

System.out.println(
    list.stream()
        .map(Whatever::getFieldX())
        .collect(Collectors.joining(", "))
);

Я все еще против расширения ArrayList или подобное, технически возможно, но я не вижу в этом ничего хорошего выбор.


1 вы могли бы продлить ArrayList и переопределить toString но вообще это не очень хорошая идея. Дополнительная информация:


вам нужно написать класс, расширяющийся из ArrayList:

import java.util.ArrayList;

public class MyArrayList extends ArrayList {
    private static final long serialVersionUID = 1L;

    @Override
    public String toString() {
        String result = "+";
        for (int i = 0; i < this.size(); i++) {
            result += " " + this.get(i);
        }
        return result;
    }
}

чтобы переопределить toString () для массива целых чисел ArrayList:

class MyArrayList extends ArrayList<Integer> {
    private static final long serialVersionUID = 1L;
    @Override public String toString(  ) {
        String output = "";
        for ( int i = 0 ; i < this.size(); i++ )
            output = Integer.toString( this.get( i ) );
        return output;
        }
    }

ArrayList<Integer> list = 
    new ArrayList<>(Arrays.asList( 5, 4, 2, 9, 1, 7 ) );
System.out.print( "list = " + list );

будет генерировать: список = [5, 4, 2, 9, 1, 7]


вы можете переопределить метод toString в новом созданном классе, но вы должны убедиться, что созданный класс расширяет ArrayList. Затем можно переопределить метод toString. Это основано на отношениях IS. Новый созданный класс является типом ArrayList.

вы также можете создать ArrayList, который основан на отношениях HAS. В этом случае вам нужно написать другой метод для возврата строки вместо переопределения метода toString.