2015-10-05 134 views
0

我對Java和一般編程(比如一個月的經驗)頗爲陌生,我有這個任務。該程序必須從文本文件中提取信息並以各種方式對其進行排序。文本文件中的數據始終按給定順序以CSV格式存儲:標題,劇情,年份,運行時間,評分,演員,導演。總會有3行文字。我已經獲得了儘可能多的數據並將其分離到數組中,但我一直在如何對它進行排序。它需要排序的方式是最短/最長的運行時間,最舊/最新的電影,並按照評分顯示。我試過轉換爲int數組和arrayList,但我不知道如何實現任何東西。如果任何人都可以幫助我,那就太棒了。基本上我只是對如何排序數據感到困惑。這是我到目前爲止有:對從文本文件中提取的數據進行排序

import java.io.FileNotFoundException; 
import java.io.File; 
import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

public class movieData{ 
public static void main(String[] args){ 
String fileName = "./movies.txt"; 
String[] lines = new String[3]; 
    readFile(lines, fileName); 
} //end main 

//method used for populating a String array with data from a file. 
//input: String[], String 
//output: none  #Array has been modified 
public static void readFile(String[] lines, String fileName){ 
int counter = 0; 
try{ 
    Scanner fromFile = new Scanner(new File(fileName)); 
    while(fromFile.hasNextLine()){ 
    lines[counter] = fromFile.nextLine(); 
    counter++; 
    }//end while 
}//end try block 
catch(FileNotFoundException e){ 
    System.out.println("File not found."); 
}//end catch block 
displayMenu(lines); 
}//end readFile 

public static void displayMenu(String[] lines){ 
Scanner kb = new Scanner(System.in); 
int choice; 
while(true){ 
    System.out.println("\n1: Display all movies"); 
    System.out.println("2: Display shortest movie"); 
    System.out.println("3: Display longest movie"); 
    System.out.println("4: Display oldest movie"); 
    System.out.println("5: Display newest movie"); 
    System.out.println("6: Display movies by rating"); 
    System.out.println("0: Quit the program"); 
    System.out.print("Choice: "); 
    choice = kb.nextInt(); 
    if(choice == 0) 
    break; 
options(choice, lines); 
}//end while 
}//end displayMenu 

public static void options(int choice, String[] lines){ 
if(choice == 1){ 
    System.out.println("Movie 1: "+lines[0]); 
    System.out.println("Movie 2: "+lines[1]); 
    System.out.println("Movie 3: "+lines[2]); 
}//end if 
if(choice == 2){ 
    oldestMovie(lines); 
}//end if  
}//end options 

public static void oldestMovie(String[] lines){ 

}//end oldestMovie 

}//end class 

那我應該用文本文件填充這樣的:

The Matrix Machines enslave humans with virtual reality 1999 136 R Keanu Reeves and Laurence Fishburne Wachowski Brothers 
Pulp Fiction Two thugs boxer and crime boss meet their fates 1994 154 R John Travolta and Samuel L. Jackson Quentin Tarantino 
Blade Runner Futuristic detective hunts obsolete androids 1982 122 R Harrison Ford and Sean Young Ridley Scott 

回答

1

確定。首先,你需要創建一些類,比如說Movie類,來爲排序提供一些上下文。一個字符串可以是任何東西,它只是一個字符序列。不過想到一個電影對象,像這樣:

public class Movie { 
    String title; 
    String plot; 
    String year; 
    String runtime; 
    double rating; 

    List<String> actors; 
    String director; 
// Setters and getters 

    public String toString(){ 
     return "Rating : " + getRating(); 
    } 
} 

現在不是選一個String數組,你需要排序的電影對象的數組(或集合)。我將向您展示如何根據評分(從最低到最高)對電影列表進行排序。

首先,研究「比較器」對象。 http://www.programcreek.com/2011/12/examples-to-demonstrate-comparable-vs-comparator-in-java/

public class MovieRatingComparator implements Comparator<Movie>{ 

    @Override 
    public int compare(Movie o1, Movie o2) { 
     //If o1's rating > o2's rating , return 1 , if it is less than o2's rating ,return -1 , else return 0. 
     return o1.getRating() > o2.getRating() ? 1 : o1.getRating() < o2.getRating() ? -1 : 0; 
    } 

} 

現在,而不是試圖排序String陣列,獲得List<Movie>對象或電影的陣列,並把它傳遞排序方法,像這樣:

public class Test { 
    public static void main(String[] args) { 
     Movie m1 = new Movie(); 
     m1.setRating(1.2); 

     Movie m2= new Movie(); 
     m2.setRating(2.3); 

     Movie m3= new Movie(); 
     m3.setRating(9); 

     List<Movie> list = Arrays.asList(m1,m2,m3); 
     Collections.sort(list,new MovieRatingComparator()); 
     System.out.println(list); 
    } 
} 

你的輸出將是:

[Rating : 1.2, Rating : 2.3, Rating : 9.0] 
+0

非常感謝您抽出寶貴的時間打印此頁。這種清除了一些東西。我仍然對如何基於文本文件中的內容創建和填充比較器感到困惑。只要格式正確,該程序應該可以與插入其中的任何文本文件一起使用。 – BaconTocino

相關問題