1

下面我贴了整个code

对于我们读取的 dvdinfo.txt 中的每一行文本,我们正在创建 DVDInfo 类的新实例并将其存储在 ArrayList 中。到目前为止,考虑这个类没有实现任何接口,并且在 main 方法中不使用任何排序方法。因此,在该标准中,当我们打印dvdList arraylist 时,它会打印文件中的所有内容而不进行排序。我的第一个疑问是存储在 ArrayList 中的新实例如何正确打印文本,我们没有使用任何 getter 方法将文本存储在 ArrayList 中。

现在考虑它在 main 中实现类似接口和 collections.sort() 的整个代码。

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() 方法。如何从 sort 调用此 compareTo() 以及这如何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

我的DVD.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
]
4

1 回答 1

3

印刷

它正在使用toString()打印每个DVDInfo对象的方法。

println方法将String.valueOf()对其参数执行 a 。然后println代码将打印结果字符串。

您传递的参数println是 a List,它有一个toString()方法,可以插入方括号和逗号并调用toString()元素,将结果放在两者之间。这将产生一个以 [ 开头并以 ] 结尾的字符串。这些大括号内是对对象和逗号调用toString()方法的结果。DVDInfo

它就是这样打印的。

排序

collectionssort()方法知道如何遍历集合并比较元素以将它们排序。它使用标准排序算法来做到这一点。但是您不需要知道算法,只需知道它会进行排序。这就是 的精髓encapsulation。班级应该做一件事,让其他班级做他们的一件事,一切都会更好。

在排序算法内部,它调用compareTo然后执行if语句来重新排序两个元素,使较低的元素在前,或者保留两个元素,使较低的元素在前。这取决于它们在排序之前是否有序。平等可以去任何一种方式——移动或不移动。但是排序算法可以决定。

笔记

您可能会发现下载 Oracle java 库的源代码并将您的 IDE 连接到源代码很有趣,这样您就可以单击(或其他)并查看各种标准库函数的源代码,例如printlnsort. 它有时太乏味但有时非常有趣。

于 2013-07-05T18:46:37.607 回答