【问题标题】:Java: Sorting text file linesJava:对文本文件行进行排序
【发布时间】:2013-10-21 13:17:55
【问题描述】:

我正在使用 eclipse,我正在尝试对一个包含大约 40 行的文本文件进行排序,如下所示:

1,Terminator,1984,Schwarzenegger
2,Avatar,2009,Worthington
3,Avengers,2012,Downey
4,Starwars,1977,Hammill
5,Alien,1979,Weaver

我想按第二个字段的字母顺序对它们进行排序,以便将文本文件更改为如下所示:

5,Alien,1979,Weaver
2,Avatar,2009,Worthington
3,Avengers,2012,Downey
4,Starwars,1977,Hammill
1,Terminator,1984,Schwarzenegger

我相当肯定我应该做一些涉及标记它们(我已经这样做来显示它)和 BufferedWriter 的事情,但我无法在我的生活中想到一种方法来做到这一点或第三个字段,我觉得我错过了一些明显的东西。

【问题讨论】:

标签: java sorting text-files


【解决方案1】:

您首先当然需要读取文件,您可以在此处了解如何操作。
Java: How to read a text file

此示例将提供几种方法,您可以在对数据进行排序后写入文件
How do I create a file and write to it in Java?

至于排序,我建议创建一个类似于

的类 Movie
public class Movie implements Comparable<Movie> {  
    private String name;
    private String leadActor;
    private Date releaseDate;

    public Movie(String name, String leadActor, String releaseDate) {

    }

    @Override
    public int compareTo(Movie other) {

    }
}  

剩下的构造函数和 compareTo 方法由你来填写。一旦你有了 compareTo 方法,你就可以调用 Collections.sort(List list) 传递你的电影列表。

这里有一些关于实现 Comparable的资源。
http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html
Why should a Java class implement comparable?

【讨论】:

    【解决方案2】:

    您的比较器

    class SampleComparator implements Comparator<String> {
        @Override
        public int compare(String o1, String o2) {
               String array1[] = o1.split(",");
               String array2[] = o2.split(",");
               return array1[1].compareTo(array2[1]);
       }
    }
    

    您的排序

    String [] lines= {"1,Terminator,1984,Schwarzenegger",
                           "2,Avatar,2009,Worthington",
                           "3,Avengers,2012,Downey",
                           "4,Starwars,1977,Hammill",
                           "5,Alien,1979,Weaver"};
    List<String> rowList = new ArrayList<String>(Arrays.asList(lines));
    Collections.sort(rowList, new SampleComparator());
    for (String string : rowList) {
         System.out.println(string);
    }   
    

    你的输出

    5,Alien,1979,Weaver
    2,Avatar,2009,Worthington
    3,Avengers,2012,Downey
    4,Starwars,1977,Hammill
    1,Terminator,1984,Schwarzenegger
    

    如果您对此有任何疑问,请告诉我..

    【讨论】:

      【解决方案3】:

      String 类有一个非常有用的静态方法,称为“split”。你所要做的就是调用 split 并将它放在分隔符中,它会返回一个带有拆分字符串的 String 数组。

      这是一个例子:

      String line = "How,Now,Brown,Cow";
      String[] splitLine = line.split(",");
      for(String l: splitLine)
      {
          System.out.println(l);
      }
      

      上面的代码将打印以下内容:

      How
      Now
      Brown
      Cow
      

      希望您可以使用它并使其适应您的问题。
      祝你好运!

      【讨论】:

        【解决方案4】:

        您要做的是使用java.util.ComparatorCollections.sort。更多信息请见:http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

        【讨论】:

          【解决方案5】:

          按照@Tyler 的回答。您可以在 Movie 类中拥有一个默认实现,并可以通过调用 Collections.sort(movieList, new MyComparator()); 来实现其他排序顺序。下面是两者的示例。

          package com.stackoverflow;
          
          
          public class Movie implements Comparable<Movie> {
              private String name;
              private String leadActor;
              private String releaseDate;
          
              public Movie(String name, String leadActor, String releaseDate) {
                  this.name = name;
                  this.leadActor = leadActor;
                  this.releaseDate = releaseDate;
              }
          
              public String getName() {
                  return name;
              }
          
              public void setName(String name) {
                  this.name = name;
              }
          
              public String getLeadActor() {
                  return leadActor;
              }
          
              public void setLeadActor(String leadActor) {
                  this.leadActor = leadActor;
              }
          
              public String getReleaseDate() {
                  return releaseDate;
              }
          
              public void setReleaseDate(String releaseDate) {
                  this.releaseDate = releaseDate;
              }
          
              @Override
          
              public int compareTo(Movie other) {
                  return getName().compareTo(other.getName());
              }
          }
          

          如果你想在你的集合上调用自己的比较器:

          package com.stackoverflow;
          
          import java.util.Comparator;
          
          public class MyComparator  implements Comparator<Movie> {
          
          
              @Override
              public int compare(Movie o1, Movie o2) {
                  return o1.getLeadActor().compareTo(o2.getLeadActor());
              }
          }
          

          【讨论】:

            【解决方案6】:

            试试这样:--

            ArrayList ar=new ArrayList();
            String [] arr=new String[10];
            int i=0;
            try {
                Scanner sc=new Scanner(file);
            
                while (sc.hasNextLine()) 
                {
                    String ss=sc.nextLine();
                    i=i+1;
                    arr[i]=ss;
                }
                ar.add(arr[5]);
                ar.add(arr[2]);
                ar.add(arr[3]);
                ar.add(arr[4]);
                ar.add(arr[1]);
                System.out.println(ar);
            }
            

            【讨论】:

              【解决方案7】:

              此解决方案使用 Java 8 API。

              您实际上不需要明确实现Comparator 或创建Comparable 类。使用 Comparator.comparing 和 lambda,我们可以通过自定义键优雅地对行进行排序。

              import java.io.IOException;
              import java.nio.file.*;
              import java.util.Comparator;
              import java.util.stream.Stream;
              
              public class FileSortWithStreams {
              
                  public static void main(String[] args) throws IOException {
                      Path initialFile = Paths.get("files/initial.txt");
                      Path sortedFile = Paths.get("files/sorted.txt");
              
                      int sortingKeyIndex = 1;
                      String separator = ",";
              
                      Stream<CharSequence> sortedLines =
                      Files.lines(initialFile)
                           .map(s -> s.split(separator))
                           .sorted(Comparator.comparing(s -> s[sortingKeyIndex]))
                           .map(s -> String.join(separator, s));
              
                      Files.write(sortedFile, sortedLines::iterator, StandardOpenOption.CREATE);
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 2013-03-16
                • 2011-10-15
                • 1970-01-01
                • 1970-01-01
                • 2019-09-30
                • 1970-01-01
                • 2022-01-10
                • 1970-01-01
                相关资源
                最近更新 更多