Создать собственный 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() для объекта. Сейчас ты просто пытаешься вывести сам объект - он возвращает адрес, который и печатается на экран
Дело в том, что в строке 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){ ... }