【问题标题】:Sorting data pulled from a text file对从文本文件中提取的数据进行排序
【发布时间】:2016-01-01 16:36:56
【问题描述】:

我对 Java 和一般编程很陌生(比如一个月的经验),我有这个任务。程序必须从文本文件中提取信息并以各种方式对其进行排序。文本文件中的数据始终按给定顺序以 CSV 格式存储:Title、Plot、Year、Runtime、Rating、Actors、Director。将始终有 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

【问题讨论】:

    标签: java arrays sorting


    【解决方案1】:

    好的。首先,您需要创建一些类,比如 Movie 类,以提供一些用于排序的上下文。字符串可以是任何东西,它只是一个字符序列。但是想想一个 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();
        }
    }
    

    现在,您需要对 Movie 对象的数组(或集合)进行排序,而不是对 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&lt;Movie&gt; 对象或电影数组,然后将排序方法传递给它,如下所示:

    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]
    

    【讨论】:

    • 非常感谢您花时间输入此内容。这样可以清除一些东西。对于如何根据文本文件中的内容创建和填充比较器,我仍然有些困惑。只要格式正确,该程序就可以处理插入其中的任何文本文件。
    猜你喜欢
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2020-01-05
    • 2017-11-20
    • 2011-10-15
    • 2018-05-08
    • 2011-10-28
    相关资源
    最近更新 更多