【问题标题】:Sorting on Last Name按姓氏排序
【发布时间】:2009-10-04 23:57:12
【问题描述】:

我正在从三个文件中读取数据,然后我想根据某些标准对记录进行排序

每个文件都有以下格式的记录

名字姓氏性别颜色日期

这是我拥有的代码...我只能使用 collections.sort 对名字进行排序...我如何对其他列进行排序...任何帮助将不胜感激..

import java.io.BufferedInputStream;
import java.io.*;
import java.sql.*;
import java.io.RandomAccessFile;
import java.io.*;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.lang.Object;
import java.util.Vector;
import java.util.*;

/**
 * This program reads a text file line by line and print to the console. 
 * It uses FileOutputStream to read the file.
 */

public class test1 {    

  public static void main(String[] args) 
    {
          try {

        ArrayList<String> rows = new ArrayList<String>();
        //  ArrayList<String> rows1 = new ArrayList<String>();
    //          ArrayList<String> rows2 = new ArrayList<String>();
    //              ArrayList<String> rows3 = new ArrayList<String>();
    BufferedReader comma = new BufferedReader(new FileReader("C:\\comma.txt"));
    BufferedReader pipe = new BufferedReader(new FileReader("C:\\pipe.txt"));
    BufferedReader space = new BufferedReader(new FileReader("C:\\space.txt"));

    String c= "";
    String p;
    String s;
    while((c = comma.readLine()) != null) {         
            rows.add(c);        
    }

      Collections.sort(rows);
    //  Collections.sort(rows2);

    FileWriter writer = new FileWriter("output.txt");
    for(String cur: rows)
    {        
        writer.write(cur+"");          
    }
   //  for(String cur: rows1)
    //  writer.write(cur+"\n");
     // for(String cur: rows2)
      // writer.write(cur+"\n");
    comma.close();
  //  pipe.close();
  //  space.close();
    writer.close();

          }
     catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }        
  }
}

【问题讨论】:

  • 随意省略导入
  • 这也是他的工作面试代码示例。
  • 您在 SO 中发布求职面试练习的事实非常有趣。

标签: java sorting


【解决方案1】:

您当前正在根据代表整行的字符串进行词法排序。在您的文件格式中,该行以名字开头,所以这就是您用来排序的内容。

如果你想按姓氏排序,你真的没有办法,只能解析每一行,以便程序可以识别姓氏。这将使您的程序更加复杂。

您可以使用 StringTokenzier 或正则表达式来识别字符串中的姓氏。 然后您可以使用自定义比较器进行排序。

一种更 OOP 的方式是将每条记录表示为一个对象,然后使用基于其字段的自定义比较器使用 Collections.sort()。很长,但它是正确的“面向对象的方式”。

如果您只是想要一个快速而肮脏的解决方案,您可能想要使用更适合文本操作的语言,例如 Perl 或 Python...

【讨论】:

    【解决方案2】:

    您需要将数据解析为真实的对象或数组,然后您可以传递一个比较器进行排序,要求它按姓氏排序。

    或者,您可以使用复杂的比较器和分隔字段的字符串来执行此操作,但这不是正确的方法,并且会比第一个选项更痛苦。

    【讨论】:

      【解决方案3】:

      1) 创建一个具有以下属性的对象:

      姓、名、性别、生日

      然后为每个属性创建 getter 方法。

      2) 从文件中读取每一行数据,并用解析后的数据创建上面的Object

      3) 将每个对象添加到您的 ArrayList

      4) 然后您可以使用BeanComparator 和/或 GroupComparator 对任何字段或字段组进行排序。

      【讨论】:

        【解决方案4】:

        用途:

        Collections.sort(List list, Comparator c)
        

        比较器确定列表中的项目如何排序。您首先需要构建一个要排序的对象列表。

        【讨论】:

          【解决方案5】:

          使用Collections.sort(List, Comparator) 代替Collections.sort(List)。您可以自定义实现 Comaparator 接口,以您想要的特定方式比较您的三个条件(性别、姓氏、日期),并将其作为第二个参数传递给 Collections.sort()。

          【讨论】:

            【解决方案6】:

            我认为此时最简单的方法是创建您自己的类,其中包含每个属性的字段。您可以定义单独的比较器 ([http://java.sun.com/javase/6/docs/api/java/util/Comparator.html])1 或使用 compareTo() 方法和开关来确定如何比较字段。

            【讨论】:

              【解决方案7】:

              这里的关键是创建一个简单的 Java 类来表示每一行(每个都有名字、姓氏、性别、颜色和日期的字段)。我们称该类为Person

              然后你用ArrayList&lt;Person&gt;替换你的ArrayList&lt;String&gt;

              List<Person> people = new ArrayList<Person>();  
              

              当您读入数据时,不要将每一行存储为字符串,而是从中创建一个新的Person 对象,并将其添加到people

              要以不同的方式对people 进行排序,您必须为每种排序创建另一个类。每个都必须实现Comparator 接口,这意味着它有一个名为compare 的方法,该方法比较两个People 并回复哪个先排序。

              然后你可以用不同的方式对列表进行排序,例如,按生日顺序排列:

              Collections.sort(people, new BirthdayComparator());
              

              祝你作业顺利。

              【讨论】:

                猜你喜欢
                • 2017-09-05
                • 2016-04-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-11-03
                • 2022-01-14
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多