对姓氏排序

时间:2009-10-04 23:57:13

标签: java sorting

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

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

名字姓氏性别颜色日期

这是我拥有的代码......我只能使用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();
    }        
  }
}

7 个答案:

答案 0 :(得分:2)

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

如果你想按姓氏排序,你真的无法解析每一行,以便程序可以识别姓氏。这将使您的计划变得更加复杂。

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

lastName,firstName,sex,birthdate

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

2)从文件中读取每行数据,并使用解析数据

创建上述对象

3)将每个Object添加到ArrayList

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

答案 3 :(得分:0)

使用:

Collections.sort(List list, Comparator c)

比较器确定列表中项目的排序方式。首先需要构建要排序的对象列表。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

然后,您将ArrayList<String>替换为ArrayList<Person>

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

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

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

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

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

祝你的作业好运。