Java - распечатать содержимое очереди

У меня есть очередь (где каждый элемент представляет собой массив целых чисел), определяемая как -

Queue<int[]> queue = new LinkedList<>();

Когда я пытаюсь распечатать очередь, я получаю такой вывод, поскольку он печатает объект массива:

[[I@58d25a40]

Как я могу переопределить метод toString() класса Queue, чтобы получить правильный результат? Я не хочу получать результат, перебирая очередь. Я надеюсь как-то добиться этого, переопределив метод toString().

Когда мы создаем любой пользовательский класс, мы можем определить метод toString() в этом классе, как печатать этот объект после того, как этот объект будет помещен в оператор System.out.print(). Есть ли аналогичный способ добиться этого с помощью класса Queue?

abhijit 11.05.2023 10:56

Нет, и Queue это не класс, это интерфейс. Конкретный класс, который вы используете, это LinkedList. Что вы могли бы сделать, так это собственный класс, который реализует Queue, возможно, поддерживаемый LinkedList, и этот класс может иметь собственный метод toString.

Federico klez Culloca 11.05.2023 11:01

Кстати, я повторно открыл ваш вопрос, но вот более общий вопрос о печати списков массивов.

Federico klez Culloca 11.05.2023 11:02

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

Federico klez Culloca 11.05.2023 11:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете попробовать что-то вроде этого:

Queue<int[]> queue = new LinkedList<>() {
  @Override public String toString() {
    return "[" +
      stream()
      .map(Arrays::toString)
      .collect(Collectors.joining(", ")) +
      "]";
  }
};

queue.add(new int[] {1, 2});
queue.add(new int[] {3, 4});
System.out.println(queue);

печать:

[[1, 2], [3, 4]]

Что, по-видимому, то, что вы хотите.

Это не обязательно хорошая идея. toString() следует использовать исключительно в целях отладки: toString ничего не требует от реализаций, даже их согласованности. Большинство вещей, о которых я могу думать, которые заставят кого-то задать этот вопрос, проблематичны.

Как я могу переопределить метод toString() класса Queue, чтобы получить правильный результат?

Вы не можете.

Для начала, Queue — это не класс, это интерфейс. Конкретный класс, который вы используете, это LinkedList.

Более конкретно, вы могли бы определить собственный класс, который реализует Queue и расширяет, например, LinkedList, и этот класс может иметь собственный метод toString (см. реализацию ниже).

Я не хочу получать результат, перебирая очередь. Я надеюсь как-то добиться этого, переопределив метод toString().

В конце концов вам придется повторить, так или иначе. Вы можете просто скрыть эту итерацию в другом методе, но итерация все равно останется под капотом.

Вот краткий план того, что вы можете сделать

import java.util.Queue;
import java.util.LinkedList;
import java.util.Arrays;
import java.util.stream.Collectors;

public class ArrayQueue extends LinkedList<int[]> implements Queue<int[]> {

    @Override
    public String toString() {
        return this.stream()
            .map(Arrays::toString)
            .collect(Collectors.joining(", ", "[", "]"));
    }
}

И тестовая программа

import java.util.Queue;

public class ArrayQueueTest {
    public static void main(String args[]) {
        Queue<int[]> q = new ArrayQueue();
        q.add(new int[]{1, 2, 3});
        q.add(new int[]{4, 5, 6});
        q.add(new int[]{7, 8, 9});
        System.out.println(q);
    }
}

Запуск этого дает

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Другие вопросы по теме