Создать собственный ArrayList. Проблема: "List1: MyArrayList@c4437c4"

 import java.util.*;
 import java.lang.String;
 import java.io.BufferedReader;
 import java.io.FileReader;
 import java.io.IOException;

 class Sortbyname implements Comparator < LabFiveFirst1 > {
     public int compare(LabFiveFirst1 doc1, LabFiveFirst1 doc2) {
         return doc1.name.compareTo(doc2.name);
     }

     @Override
     public Comparator < LabFiveFirst1 > reversed() {
         return null;
     }
 }

 // List<T> для Collections.sort
 class MyArrayList < T > implements List < T > {
     private final int INIT_SIZE = 16;
     private final int CUT_RATE = 4;
     private Object[] array = new Object[INIT_SIZE];
     private int pointer = 0;

     /*
     Добавляет новый элемент в список. При достижении размера внутреннего
     массива происходит его увеличение в два раза.
     */

     public boolean add(T item) {
         if (pointer == array.length - 1)
             resize(array.length * 2);
         array[pointer++] = item;
         System.out.println("Element:" + item);

         return false;
     }

     /*Вспомогательный метод для масштабирования.*/
     private void resize(int newLength) {
         Object[] newArray = new Object[newLength];
         System.arraycopy(array, 0, newArray, 0, pointer);
         array = newArray;
     }

     @Override
     public boolean remove(Object o) {
         return false;
     }

     @Override
     public boolean containsAll(Collection << ? > collection) {
         return false;
     }

     @Override
     public boolean addAll(Collection << ? extends T > collection) {
         return false;
     }

     @Override
     public boolean addAll(int i, Collection << ? extends T > collection) {
         return false;
     }

     @Override
     public boolean removeAll(Collection << ? > collection) {
         return false;
     }

     @Override
     public boolean retainAll(Collection << ? > collection) {
         return false;
     }

     @Override
     public void clear() {

     }

     public T get(int index) {
         return (T) array[index];
     }

     @Override
     public T set(int i, T t) {
         return null;
     }

     @Override
     public void add(int i, T t) {

     }
     public T remove(int index) {
         for (int i = index; i < pointer; i++)
             array[i] = array[i + 1];
         array[pointer] = null;
         pointer--;
         if (array.length > INIT_SIZE && pointer < array.length / CUT_RATE)
             resize(array.length / 2); // если элементов в CUT_RATE раз меньше чем
         // длина массива, то уменьшу в два раза
         return null;
     }

     @Override
     public int indexOf(Object o) {
         return 0;
     }

     @Override
     public int lastIndexOf(Object o) {
         return 0;
     }

     @Override
     public ListIterator < T > listIterator() {
         return null;
     }

     @Override
     public ListIterator < T > listIterator(int i) {
         return null;
     }

     @Override
     public List < T > subList(int i, int i1) {
         return null;
     }


     public int size() {
         return pointer;
     }

     @Override
     public boolean isEmpty() {
         return false;
     }

     @Override
     public boolean contains(Object o) {
         return false;
     }

     @Override
     public Iterator < T > iterator() {
         return null;
     }

     @Override
     public Object[] toArray() {
         return new Object[0];
     }

     @Override
     public < T1 > T1[] toArray(T1[] t1s) {
         return null;
     }
 }

 class LabFiveFirst1 {
     public String name;
     public double price;

     public LabFiveFirst1(String name, double price) {
         this.name = name;
         this.price = price;
     }

     @Override
     // переопределяем метод таким образом, чтобы
     // он возвращаем информацию об объекте в читабельном виде
     public String toString() {
         return "[name=" + this.name + ", price=" + this.price + "]";
     }
 }

 public class LabFiveFirst {
     public static void main(String[] args) {
         String fileName = "D:\\IntelliJ IDEA Community Edition 2019.3.2\\works\\src\\LabFive1.txt";
         String fileName2 = "D:\\IntelliJ IDEA Community Edition 2019.3.2\\works\\src\\LabFive1(2).txt";
         MyArrayList < LabFiveFirst1 > list = new MyArrayList < > ();

         try {
             BufferedReader reader = new BufferedReader(new FileReader(fileName));

             String line = null;
             while ((line = reader.readLine()) != null) {
                 int index = line.lastIndexOf(' ');

                 if (index == -1) {
                     // Wrong format
                 } else {

                     String name = line.substring(0, index);
                     Double price = 0.0; // dafault value
                     try {
                         price = Double.parseDouble(line.substring(index));
                     } catch (NumberFormatException e) {
                         // Wrong format
                     }
                     list.add(new LabFiveFirst1(name, price));

                 }
             }

             System.out.println("List1: " + list);
             Sortbyname sortbyname = new Sortbyname();
             Collections.sort(list, sortbyname);
             работает если class MyArrayList < T > implements List < T >
                 System.out.println("List1(sorted): " + list);

             reader.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
         System.out.println("-----------------------------");

         MyArrayList < LabFiveFirst1 > list2 = new MyArrayList < > ();
         try {
             BufferedReader reader2 = new BufferedReader(new FileReader(fileName2));
             String line2 = null;
             while ((line2 = reader2.readLine()) != null) {
                 int index2 = line2.lastIndexOf(' ');
                 if (index2 == -1) {
                     // Wrong format
                 } else {
                     String name = line2.substring(0, index2);
                     Double price = 0.0; // dafault value
                     try {
                         price = Double.parseDouble(line2.substring(index2));
                     } catch (NumberFormatException e) {
                         // Wrong format
                     }
                     list2.add(new LabFiveFirst1(name, price));
                 }
             }

             System.out.println("List1: " + list2);
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }

Вот что в LabFive1.txt:

flour 12
banana 35
shoes 550
juice 40

LabFive1(2).txt:

jozzy 25
ikra 31

Я должен считать данные, отсортировать и вывести. Но постоянно выводит MyArrayList@c4437c4. Помогите исправить, пожалуйста.


Ответы (2 шт):

Автор решения: Евгений Быков

Тебе необходимо выводить .toString() для объекта. Сейчас ты просто пытаешься вывести сам объект - он возвращает адрес, который и печатается на экран

→ Ссылка
Автор решения: Leviathan_ZC

Дело в том, что в строке System.out.println("List1: " + list); ты выводишь значение переменной list. А эта переменная является объектной, или, как её еще называют, ссылочной.

И ее называют не просто так. Термин ссылочная означает, что переменная хранит в себе всего лишь адрес объекта в памяти в строковом представлении, чтобы Java могла спарсить оттуда значение адреса, которое находится после знака @ и найти его.

Именно поэтому тебе выводит "НазваниеКласса @ адрес". Сам по себе объект список(MyArrayList) состоит у тебя из других объектов(LabFiveFirst1). У них метод toString() ты переопределил, а у списка забыл.

Ну а список выводится обычно через цикл for/foreach.
Предпочтительнее использовать этот метод(меньше кода, больше понимания):

for (String s : list) {
    System.out.println(s);
}

Ну либо ты можешь попробовать инкапсулировать этот код в toString() твоего класса MyArrayList, но нужно учитывать, что toString должен возвращать строку, поэтому в этот цикл стоит, вместо System.out.println(), вставить StringBuilder или StringBuffer, формируя строку с перечисленными в списке объектами и возвращать вышеприведенный объект к строке.

@Override
public String toString(){
    StringBuffer sb = new StringBuffer();
    for (Object s : array) {
        sb.append(s);
    }
    return sb.toString();
}

Вот пример моего кода для твоего проекта. Конечно же я знаю, что можно сделать и проще, но чтобы разобраться - пойдет.

UPD: В твоем решении создания своего списка выдает сразу все содержимое списка, даже если "зарезервированные" ячейки являются пустыми. Поэтому рекомендую обернуть sb.append(s); в условие if(s!=null){ ... }

→ Ссылка