Использование toString с вложенными структурами [дубликат]

197
06 марта 2018, 03:41

На данный вопрос уже ответили:

  • Применении метода toString на массивах 2 ответа

Допустим мы имеем Map<Integer, Integer[]> и нам надо воспользоваться toString.

Тут и проблема: нам возвращают совсем не ту строку, что можно ожидать.

Например:

Map<Integer, Integer[]> mp = new HashMap<Integer, Integer[]>();
mp.put(1, new Integer[]{1, 2});
mp.put(2, new Integer[]{2, 3});
mp.put(3, new Integer[]{3, 4});
out.println(mp.toString());

Так нам выводит {1=[Ljava.lang.Integer;@7852e922, 2=[Ljava.lang.Integer;@4e25154f, 3=[Ljava.lang.Integer;@70dea4e} вместо более ожидаемого {1=[1, 2], 2=[2, 3], 3=[3, 4]}. И вроде как логично, но совсем не то что нам надо.

Что делать, чтобы получить что хочется? Явно есть решение, которое не есть обработка структуры вручную.

Answer 1

К сожалению, в Java у массивов примитивных типов не переопределён метод toString. Поэтому к ним применяется метод, содержащийся в классе Object. Этот метод, конечно, не знает, как нужно выводить массивы. Однако специальный метод для этого есть в классе Arrays. Поэтому вы можете создать свой класс, который будет содержать массив целых чисел с переопределённым методом toString.

Например, вот так:

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Map<Integer, IntegerArray> mp = new HashMap<Integer, IntegerArray>();
        mp.put(1, new IntegerArray(1, 2));
        mp.put(2, new IntegerArray(2, 3));
        mp.put(3, new IntegerArray(3, 4));
        System.out.println(mp);
    }
}
class IntegerArray {
    int[] array;
    IntegerArray(int... array){
        this.array = array;
    }
    @Override
    public String toString(){
        return Arrays.toString(array);
    }
}

Вывод будет:

{1=[1, 2], 2=[2, 3], 3=[3, 4]}
Answer 2

В Java toString для массивов не выводит их значения, а всего лишь показывает объект в текстовом представлении. Для получения значений массива нужно воспользоваться методом toString класса Arrays. Соответственно, для вашего примера достаточно:

for(Map.Entry<Integer,Integer[] > entry : mp.entrySet())
{
     System.out.print(entry.getKey());
     System.out.println(Arrays.toString(entry.getValue()));
}
READ ALSO
Как смотреть исходники java из idea?

Как смотреть исходники java из idea?

Как настроить intelij idea, чтобы можно было перейти к читабельным исходникам, например посмотреть, как реализован HashSet

174
Отношения между классами

Отношения между классами

Допустим, у меня есть классы : Текст, Предложение, Слово, Буква, ПунктуацияЗадача: удалить в каждом слове повторяющиеся буквы

147
Не принимает решение задачи по колоде карт:(

Не принимает решение задачи по колоде карт:(

Здравствуйте) Решаю задачку по колоде карт на 1 сайте) Надо сделать перемешивание, сортировку, метод, который возвращает true, когда в колоде...

204
Как добавить стиль к тексту?

Как добавить стиль к тексту?

Как добавить стиль css('text-decoration', 'line-through') к label при включенном чекбоксе?

193