Переопределение метода toString () для вывода значений ArrayList в Java


Метод toString()

Часто необходимо узнать содержимое того или иного объекта. Для этого в классе Object языка Java определен специальный метод toString() , возвращающий символьную строку описывающую объект. При создании нового класса принято переопределение toString() таким образом, чтобы возвращающая строка содержала в себе имя класса, имена и значения всех переменных.

Следующий пример демонстрирует это:

Для вызова метода toString() необходимо просто передать нужный объект в System.out.println :

Результат выполнения программы будет такой:

Чисто теоретически можно явно вызывать метод toString() — System.out.println(person.toString()) , но так не принято.

Если у класса Person не переопределен метод toString() , то при запуске класса PersonDemo4 вызовется метод toString() , определенный в классе Object . И на консоль выведется нечто такое:

12.6. Java — Метод toString()

Содержание

Описание

Метод toString() — используется в Java для получения строкового объекта, представляющего значение числового объекта, другими словами — преобразует число в строку.

Если метод принимает в качестве аргумента простой тип данных, то возвращается строковый объект, представляющий значение простого типа данных.

Если метод toString() в Java принимает два аргумента, то будет возвращено строковое представление первого аргумента в системе счисления по целочисленному основанию, указанному вторым аргументом.

Синтаксис

Все вариант метода приведены ниже:

Параметры


Подробная информация о параметрах:

  • i — int, который будет преобразован и возвращён как строковый объект (String).

Как переопределить метод toString для отображения элементов в списке в Java?

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

Для полноты я выложил весь код ниже. Если я не переопределить метод toString, я получу представление для хэш-кода для объекта.

Я пытался использовать следующее:

Тем не менее, это не помогает, так как я все еще получаю ссылку на хэш-код. Я понимаю, что это потому, что я не переопределяю метод toString должным образом; Я получаю сообщение об ошибке, когда добавляю аннотацию @Override, но это насколько я смог получить.

Я посмотрел на некоторые другие ответы, в которых говорилось, что переопределение метода toString не будет полезным в случае списков / коллекций, но не было дано надлежащего руководства для другой альтернативы.

Извините, я забыл упомянуть, что я попытался удалить параметры в методе Override следующим образом:

> Но когда я запустил код, консоль ничего не отображала. Я понимаю, что это потому, что я создал пустой список, но я не знал, что еще делать.

Java. Метод toString()

Класс Object имеет метод toString() , который наследует каждый создаваемый вами класс. Он возвращает представление вашего объекта в виде String и очень полезен для отладки. Чтобы увидеть действие метода toString() , реализованное по умолчанию, выполните следующий эксперимент в методе main() :

Результат, отображаемый в консоли, выглядит следующим образом:

Метод println() вызывает метод toString() объекта, переданного ему. Поскольку мы пока не перегрузили toString() , то получаем вывод информации по умолчанию, которой является ID объекта. Каждый объект имеет ID, но он не много скажет вам о самом объекте. Было бы лучше, если бы мы перегрузили toString() для выдачи красиво отформатированного содержимого нашего объекта Adult :

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


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

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

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

Мастер Йода рекомендует:  Полное руководство по обучению программирования на Java

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

Или если у вас есть List :

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

1 вы можете расширить ArrayList и переопределить , toString но в целом это не хорошая идея. Дополнительная информация:

Списочный массив ArrayList

В Java массивы имеют фиксированную длину и не могут быть увеличены или уменьшены. Класс ArrayList реализует интерфейс List и может менять свой размер во время исполнения программы, при этом не обязательно указывать размерность при создании объекта. Элементы ArrayList могут быть абсолютно любых типов в том числе и null.

Пример создания объекта ArrayList

Можно инициализировать массив на этапе определения. Созданный объект list содержит свойство size. Обращение к элементам массива осуществляется с помощью метода get(). Пример :

Добавление элемента в массив ArrayList, метод add

Работать с ArrayList просто: необходимо создать объект и вставлять созданные объекты методом add(). Обращение к элементам массива осуществляется с помощью метода get(). Пример:

Замена элемента массива ArrayList, метод set

Чтобы заменить элемент в массиве, нужно использовать метод set() с указанием индекса и новым значением.

Удаление элемента массива ArrayList, метод remove


Для удаления элемента из массива используется метод remove(). Можно удалять по индексу или по объекту:

ПРИМЕЧАНИЕ: элементы, следующие после удалённого элемента, перемещаются на одну позицию ближе к началу. То же самое относится и к операции вставки элемента в середину списка.

Для очистки всего массива используется метод clear():

Определение позиции элемента ArrayList, метод indexOf

В списочном массиве ArrayList существует метод indexOf(), который ищет нужный элемент и возвращает его индекс.

Отсчёт в массиве начинается с 0, если индекс равен 2, значит он является третьим в массиве.

Проверка наличие элемента в ArrayList, метод contains

Чтобы узнать, есть в массиве какой-либо элемент, можно воспользоваться методом contains(), который вернёт логическое значение true или false в зависимости от присутствия элемента в наборе :

Понятно, что в массиве никаких овощей быть не может, поэтому в консоле будет отображено false.

Создание массива из элементов ArrayList, метод toArray

Для конвертирования набора элементов в обычный массив необходимо использовать метод toArray().

Интерфейс List

java.util.List является интерфейсом и его следует использовать вместо ArrayList следующим образом :

Или укороченный вариант для Java 7:

В примере тип ArrayList заменен на List, но в объявлении оставлен new ArrayList(). Всё остальное остаётся без изменений. Это является рекомендуемым способом.


Интерфейс List реализует более общий интерфейс коллекции Collection.

Преобразование массива в список, Arrays

Для создания массива можно не только добавлять по одному объекту через метод add(), но и сразу массив с использованием Arrays.asList(. ).

Пример создания и инициализации массива из объектов Integer.

У данного способа есть недостаток. Если вы определили списочный массив таким образом, то уже не можете вставлять или удалять элемент, хотя при этом можете изменять существующий элемент.

добавление и вывод элементов ArrayList

Базовые технологии Java /

Коллекции (Java Collection Framework)

02 дек 2009 08:58

Проблема такая нужно реализовать добавление и вывод элементов ArrayList.
У меня 3 класса
Laba2:меню с вызовом методов из класса Container
Ball:класс шар с свойством размер и конструктором для установки размера
Container:класс где создаю список balls и пытаюсь туда добавить элемент в методе addBall() и вывести то, что находится в списке методом listAll()
Нужно подправить добавление элемента и сделать вывод списка при помощи цикла foreach

Администрация: оформляйте свои сообщения с помощью bb-кодов.

02 дек 2009 09:37

так в чем проблема то? что подправить в addBall? тут вроде все нормально он добавляется в список.

How to overr >By Chaitanya Singh | Filed Under: Java Collections

When we are dealing with ArrayList of Objects then it is must to Override the toString() method in order to get the output in desired format. In this tutorial we will see how to override the toString() method for ArrayList in Java.

Example:


We have two classes here “Student” and “Demo”. Student class has only two properties student name and student age. As you can see that we have overridden the toString() method in Student class itself. In the Demo class we are storing the Student Object in ArrayList and then we iterated the ArrayList using advance for loop. You can very well see that the output is in the format we have specified in toString(). You can give the toString() coding as per your requirement.

If we wouldn’t have overridden the toString() we would have got the output in below format:
Output of the above programs without overriding toString():

Переопределение метода toString

Я использую .toString, чтобы вернуть строковое представление объекта, т. Е.

будет производить e2e4.

Я пытаюсь извлечь текст этого объекта (e2e4) в виде строки. После Googling я столкнулся с переопределением метода toString, поэтому я придумал следующее:

Мои вопросы довольно простые:

  1. это правильный подход
  2. Как я могу вызвать эту процедуру при попытке получить текст объекта?

Переопределение Object.toString – хороший подход.

Однако ваша текущая реализация делает серьезную ошибку, создавая новый объект Move (см. Ниже).

Чтобы вызвать процедуру (как только вы ее исправите), сделайте то, что вы уже делаете:

Если toString() следует использовать только для отладки (как говорит mre), вы можете реализовать другой метод с именем getText который делает то же самое.

ВАЖНАЯ ЗАМЕТКА:

Вы не должны создавать новый объект Move внутри своего метода toString .

Это очень плохая идея (как упоминалось другими).


Ваш метод toString должен просто построить строку и вернуть ее.

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

В любом случае, чтобы сгенерировать строковое представление в classе Move попробуйте что-то вроде этого:

Затем, если вы хотите получить представление строки, что вы на самом деле делаете ( jcb.engineMove(move.toString()); ) не плохой подход.

использование Object#toString должно ограничиваться отладкой.

Надеюсь, это не код метода toString() в classе Move . Причина моего страха заключается в том, что вы создаете объект Move внутри него и вызываете рекурсивно метод toString() s+=»» + move; помощью s+=»» + move; (это то же самое, что и s+=move.toString() ).

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

В Java (например, в других языках, таких как C #) метод toString() определяется в типе объекта, что означает, что каждый объект в Java имеет этот метод. Если ваш пользовательский объект (который наследует object classа) перезаписывает метод toString() ваш базовый class предоставляет новую реализацию этого метода, который скрывает / исключает метод toString() из суперclassа.

Это означает, что при определении пользовательского метода toString() в вашем пользовательском classе A вызов экземпляра этого типа (скажем, это a) a.toString() приведет к вызову вашей реализации.

Я бы, вероятно, не использовал toString () в этом случае, потому что кажется, что вы просто повторяете логику, находящуюся в classе Move. Чтобы добавить какие-либо другие детали, у меня есть один вопрос: к какому classу вы добавляете этот метод toString ()?

Вы вызываете этот метод так же, как и любой другой метод. Сначала вам понадобится экземпляр объекта для вызова:

Чтобы дать более подробную информацию, мне нужен ответ на предыдущий вопрос.

Как сказал mre, вы не должны использовать toString () для чего-то, что ваш код зависит от функции. Теперь, чего вы пытаетесь достичь? Можете ли вы дать какой-либо код из этих classов? Я бы подумал, что ваш метод engineMove должен взять объект Move, а не строку. Если вы можете дать более подробную информацию, мы сможем управлять вами в лучшем направлении.

Кроме того, будьте осторожны с тем кодом, который у вас есть. Зачем вам нужно создать новый объект Move, который занимает время и ресурсы внутри toString ()? toString () должен работать с экземпляром >

Как получить конкретную строку в ArrayList для сравнения if-else [duplicate]


Я использовал оператор == в своей программе, чтобы сравнить все мои строки до сих пор. Тем не менее, я столкнулся с ошибкой, вместо этого изменил один из них на .equals() , и он исправил ошибку.

Неужели == плохо? Когда он должен и не должен использоваться? В чем разница?

22 ответа

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals() , поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals() .

Вы почти всегда хотите использовать Objects.equals() . В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать == .

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String . Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern .

. Подобные примеры также можно найти в JLS 3.10.5-1 .

Я думаю, что когда вы определяете String , вы определяете объект. Поэтому вам нужно использовать .equals() . Когда вы используете примитивные типы данных, вы используете == , но с String (и любым объектом) вы должны использовать .equals() .

Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String(«Testing») , вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, «MyString» == new String(«MyString») всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому «MyString» == new String(«MyString»).intern() вернет true.


Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

Я согласен с ответом от zacherates.

Но вы можете сделать вызов intern () в ваших нелиберальных строках.

Из примера zacherates:

Если вы ставите нелитеральное равенство строки, это правда

Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.

В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.

Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:

Этот метод String равен методу для двух строк Java, и если они содержат точно такую ​​же строку символов, они считаются равными.

Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):

Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:

Вариант 2: Сравнение строк с методом equalsIgnoreCase

В некоторых строковых сравнительных тестах вы захотите игнорируйте, являются ли строки строчными или строчными. Если вы хотите проверить свои строки на равенство в этом случае нечувствительным образом, используйте метод equalsIgnoreCase класса String, например:

Вариант 3: сравнение строк Java с методом compareTo

Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:

Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).

Мастер Йода рекомендует:  Создание и удаление таблиц в MS SQL Server
Добавить комментарий