Объект, хранящийся в ArrayList, выводит правильное значение. А как работает Comparable Interface?

Ниже я наклеил весь code.

Для каждой строки текста в dvdinfo.txt, которую мы читаем, мы создаем новый экземпляр класса DVDInfo и сохраняем его в ArrayList. На данный момент учтите, что этот класс не реализует никакого интерфейса и в основном методе не использует какой-либо метод сортировки. Таким образом, в соответствии с этими критериями, когда мы печатаем dvdList arraylist, он распечатывает все, как в файле, без сортировки. Мое первое сомнение заключается в том, что новый экземпляр, хранящийся в ArrayList, правильно печатает текст, в то время как мы не использовали какой-либо метод получения для сохранения текста в том виде, в котором он находится в ArrayList.

Теперь рассмотрим весь код, который реализует сопоставимый интерфейс и collections.sort () в main.

The compareTo() method returns an int with the following characteristics:
* negative if thisObject < anotherObject 
* zero If thisObject == anotherObject 
* positive If thisObject > anotherObject 
    Wrote in SCJP by Kathy/Bates

В приведенном ниже коде он реализует метод compareTo (). Как происходит вызов этого compareTo () из sort и как этот int values полезен для метода sort для сортировки объектов. Как это работает, когда мы сравниваем с ним только титровальный объект и как происходит сортировка. Как этот файл collections.sort (dvdlist) совместно работает с методом compareTo ()?

dvdinfo.txt

Donnie Darko/sci-fi/Gyllenhall, Jake
Raiders of the Lost Ark/action/Ford, Harrison
2001/sci-fi/??
Caddy Shack/comedy/Murray, Bill
Star Wars/sci-fi/Ford, Harrison
Lost in Translation/comedy/Murray, Bill
Patriot Games/action/Ford, Harrison

MyDVD.java

import java.util.*;
import java.io.*;

class DVDInfo implements Comparable<DVDInfo>{
    String title;
    String genre;
    String leadActor;

    DVDInfo(String t, String g, String a){
        title = t; genre = g; leadActor = a;
    }

    public String toString(){
        return title + " " + genre + " " + leadActor + "\n";
    }

    public int compareTo(DVDInfo d){
        return title.compareTo(d.getTitle());
    }

    public String getTitle(){
        return title;
    }

    public String getGenre(){
        return genre;
    }

    public String getLeadActor(){
        return leadActor;
    }

    public void setTitle(String t){
        title = t;
    }

    public void setGenre(String g){
        genre = g;
    }
    public void setLeadActor(String l){
        leadActor = l;
    }


}

public class MyDVD{
    public static void main(String[] args){
        ArrayList<DVDInfo> dvdList = new ArrayList<DVDInfo>();
        populateList(dvdList);

        Collections.sort(dvdList);
        System.out.println(dvdList);

    }

    public static void populateList(ArrayList<DVDInfo> dvdList){
        try{    
            File file = new File("dvdinfo.txt"); 
            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);

            String s;
            while ((s = br.readLine()) != null){
                String[]tokens = s.split("/");
                dvdList.add(new DVDInfo(tokens[0],tokens[1],tokens[2]));
            }
            br.close();
        }catch(IOException e){System.out.println("File doesn\'t exist");}

    }

}

Вывод:

[2001 sci-fi ??
, Caddy Shack comedy Murray, Bill
, Donnie Darko sci-fi Gyllenhall, Jake
, Lost in Translation comedy Murray, Bill
, Patriot Games action Ford, Harrison
, Raiders of the Lost Ark action Ford, Harrison
, Star Wars sci-fi Ford, Harrison
]

person Java Beginer    schedule 05.07.2013    source источник
comment
Это уже было объяснено в книге. Если это не помогло понять, возможно, также прочтите документацию по Java.   -  person Ravi K Thapliyal    schedule 05.07.2013
comment
Я прошел через все. Тем не менее я не понял и пролистал ту же страницу и просматривал ответы в течение последних 3 часов.   -  person Java Beginer    schedule 05.07.2013


Ответы (1)


Печать

Он использует метод toString() для печати каждого DVDInfo объекта.

Метод println сделает String.valueOf() над своим параметром. Затем код println напечатает результирующую строку.

Параметр, который вы передаете println, - это List, и у него есть toString() метод своего owh, который вставляет квадратные скобки и запятые и вызывает toString() для элементов, помещая результат между ними. Это создает строку, начинающуюся с [и заканчивающуюся]. Внутри фигурных скобок находятся результаты вызова метода toString() для объектов DVDInfo и запятых.

Вот как это печатается.

Сортировка

Метод collection sort() знает, как пройти по коллекции и сравнить элементы, чтобы упорядочить их. Для этого используются стандартные алгоритмы сортировки. Но вам не нужно знать алгоритм, просто он выполняет сортировку. В этом суть encapsulation. Классы должны делать одно, а другие должны делать одно, и все работает лучше.

Внутри алгоритма сортировки он вызывает compareTo, а затем выполняет операторы if, чтобы либо переупорядочить два элемента, чтобы нижний был первым, либо оставить два элемента так, чтобы нижний был первым. Это зависит от того, были ли они в порядке до сортировки. Равный может идти любым путем - двигаться или нет. Но решает алгоритм сортировки.

Примечания

Возможно, вам будет интересно загрузить исходный код для Java-библиотек Oracle и подключить свою IDE к источнику, чтобы вы могли щелкнуть (или что-то еще) и просмотреть исходный код для различных стандартных библиотечных функций, таких как println и sort. Иногда это слишком утомительно, но иногда очень интересно.

person Lee Meador    schedule 05.07.2013
comment
Но ее метод toString () заменяется на него настраиваемым текстом и нигде не печатается. - person Java Beginer; 05.07.2013
comment
Я добавил некоторые детали. Это помогает? - person Lee Meador; 05.07.2013
comment
+1 Спасибо Ли. Это помогает мне получить представление. Если я перейду к исходному коду, как вы сказали, я думаю, у меня будет хорошая идея. - person Java Beginer; 05.07.2013
comment
Думаю, вы забыли объяснить мне, как compareto () сравнивается только с объектом строки заголовка. Почему не нужно сравнивать кого-то другого ?? - person Java Beginer; 05.07.2013
comment
Я не знаю "почему". Это то, что делает код, когда сравнивает содержимое поля title на двух сравниваемых объектах DVDInfo. Кто-то написал код, и они этого хотели. Я могу предположить. Так что я буду. Возможно, они посчитали, что фильмов с одинаковым названием не так много, и сортировка по названию подойдет. - person Lee Meador; 05.07.2013