У меня есть очередь (где каждый элемент представляет собой массив целых чисел), определяемая как -
Queue<int[]> queue = new LinkedList<>();
Когда я пытаюсь распечатать очередь, я получаю такой вывод, поскольку он печатает объект массива:
[[I@58d25a40]
Как я могу переопределить метод toString() класса Queue, чтобы получить правильный результат? Я не хочу получать результат, перебирая очередь. Я надеюсь как-то добиться этого, переопределив метод toString().
Нет, и Queue это не класс, это интерфейс. Конкретный класс, который вы используете, это LinkedList. Что вы могли бы сделать, так это собственный класс, который реализует Queue, возможно, поддерживаемый LinkedList, и этот класс может иметь собственный метод toString.
Кстати, я повторно открыл ваш вопрос, но вот более общий вопрос о печати списков массивов.
«Я не хочу получать результат, перебирая очередь. Я надеюсь как-то добиться этого, переопределив метод toString()». В конце концов вам придется повторить, так или иначе. Вы можете просто скрыть эту итерацию в другом методе, но итерация все равно останется под капотом.




Вы можете попробовать что-то вроде этого:
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]]
Когда мы создаем любой пользовательский класс, мы можем определить метод toString() в этом классе, как печатать этот объект после того, как этот объект будет помещен в оператор System.out.print(). Есть ли аналогичный способ добиться этого с помощью класса Queue?