如何使用Java按字母顺序从一个文件到另一个文件对姓氏进行排序?

时间:2011-01-17 00:46:13

标签: java sorting

我编写了这段代码,不知道如何按字母顺序从我的文件到另一个文件中对姓氏进行排序。

import java.io.*;
import java.util.*;

class Asmuo {
    String pavarde;
    String vardas;
    long buvLaikas;
    int atv1;
    int atv2;
    int atv3;
}

class Irasas {
    Asmuo duom;
    Irasas kitas;
}

class Sarasas {
    private Irasas p;

    Sarasas() {
        p = null;
    }

    Irasas itrauktiElementa(String pv, String v, long laikas, int d0, int d1,
            int d2) {
        String pvrd, vrd;
        int data0;
        int data1;
        int data2;
        long lks;
        lks = laikas;
        pvrd = pv;
        vrd = v;
        data0 = d0;

        data1 = d1;

        data2 = d2;
        Irasas r = new Irasas();
        r.duom = new Asmuo();
        uzpildymasDuomenimis(r, pvrd, vrd, lks, d0, d1, d2);
        r.kitas = p;
        p = r;
        return r;
    }

    void uzpildymasDuomenimis(Irasas r, String pv, String v, long laik, int d0,
            int d1, int d2) {
        r.duom.pavarde = pv;
        r.duom.vardas = v;
        r.duom.atv1 = d0;
        r.duom.buvLaikas = laik;
        r.duom.atv2 = d1;
        r.duom.atv3 = d2;
    }

    void spausdinti() {
        Irasas d = p;
        int i = 0;
        try {
            FileWriter fstream = new FileWriter("rez.txt");
            BufferedWriter rez = new BufferedWriter(fstream);
            while (d != null) {
                System.out.println(d.duom.pavarde + " " + d.duom.vardas + " "
                        + d.duom.buvLaikas + " " + d.duom.atv1 + " "
                        + d.duom.atv2 + " " + d.duom.atv3);
                rez.write(d.duom.pavarde + " " + d.duom.vardas + " "
                        + d.duom.buvLaikas + " " + d.duom.atv1 + " "
                        + d.duom.atv2 + " " + d.duom.atv3 + "\n");
                d = d.kitas;
                i++;
            }
            rez.close();
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }

    }
}

public class Gyventojai {

    public static void main(String args[]) {
        Sarasas sar = new Sarasas();
        Calendar atv = Calendar.getInstance();
        Calendar isv = Calendar.getInstance();

        try {
            FileInputStream fstream = new FileInputStream("duom.txt");
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String eil;
            while ((eil = br.readLine()) != null) {
                String[] cells = eil.split(" ");
                String pvrd = cells[0];
                String vrd = cells[1];
                atv.set(Integer.parseInt(cells[2]), Integer.parseInt(cells[3]),
                        Integer.parseInt(cells[4]));
                isv.set(Integer.parseInt(cells[5]), Integer.parseInt(cells[6]),
                        Integer.parseInt(cells[7]));
                long laik = (isv.getTimeInMillis() - atv.getTimeInMillis())
                        / (24 * 60 * 60 * 1000);
                int d0 = Integer.parseInt(cells[2]);
                int d1 = Integer.parseInt(cells[3]);
                int d2 = Integer.parseInt(cells[4]);
                sar.itrauktiElementa(pvrd, vrd, laik, d0, d1, d2);

            }
            in.close();
        } catch (Exception e) {
            System.err.println("Error: " + e.getMessage());
        }

        sar.spausdinti();

    }
}

3 个答案:

答案 0 :(得分:3)

如果我做出一些不正确的假设,你将不得不原谅我,因为我不会说立陶宛语?所以你的变量和方法名称让我很难理解你的代码。

您似乎拥有自己的“人员”记录的链接列表结构。根据姓氏对记录进行排序有几种不同的方法。一种方法是编写一种方法,通过手动移动节点和破坏/重新创建节点之间的链接来对链表进行排序。

另一种方法是将列表转储到标准列表中,并使用Collections.sort()和适当的Comparator类对列表进行排序。

class Sarasas {
...
private List<Asmuo> sortList() {
    // dump your list into an ArrayList
    List<Asmuo> data = new ArrayList<Asmuo>();
    Irasas node = p;   // start with the Sarasas object's head node
    while (node != null) {
        data.add(node);
        node = node.kitas;
    }

    // sort your list
    Collections.sort(data, new AsmuoComparator() );

    return data;
}


class AsmuoComparator  implements Comparator<Asmuo>
{
    public int compare(Asmuo p1, Asmuo p2)
    {
        return p1.pavarde.compareToIgnoreCase(p2.pavarde);  
            // I'm assuming pavarde is the surname?
    }
}

现在,您可以使用为所需内容返回的List。按顺序遍历列表并对每个项目执行某些操作:

List<Asmuo> data = sortList();
for (Asmuo a : data) {
    // write to file, etc...
}
祝你好运!如果我的任何假设都错了,请告诉我,所以我可以修改我的答案。

答案 1 :(得分:2)

虽然我对这段代码没有具体的评论,但坦率地说,由于我对你所使用的语言缺乏了解,我觉得很难阅读,作为一般方法,这就是我要解决的问题。你问的问题是:

  1. 使用POJO类创建一个List类型来保存名称/数据/ etc列表以保存数据。如果我事先不知道列表的长度,我经常使用LinkedList类型,如果我事先知道有多少元素,我经常使用ArrayList。
  2. 将文件1中的所有数据读入此对象列表。
  3. 创建一个实现Comparator的类,其中包含指定POJO类的泛型
    您可以在此类中对名称进行比较以检查订单。您还可以使用java String方法比较或compareIgnoreCase让java为您进行名称比较。
  4. 将列表和此Comparator实现传递给Arrays.sort
  5. 写出已排序的java对象列表。
  6. 这适用于任何Java对象类型,并且排序方法可以完全是任意的,或者基于数据的一些新颖特征。我很少使用这种方法,而且Java为您完成了大部分繁重工作,它可以最大限度地减少您的时间和精力投入。当Java已经准备好供你使用时,没有任何意义重新发明轮子。

答案 2 :(得分:0)

我很惊讶在这种情况下没有一个答案建议使用Collator。所以我只想补充说你应该使用Collat​​or进行比较,如下所示

Collator collator = Collator.getInstance(new Locale(...));
Collections.sort(yourList, collator);

完整示例可以是found here


使用提示进行编辑,以便在RD01的代码中使用

RD01

提供的示例代码中添加Collat​​or中可用的compare()方法,而不是 equalsIgnoreCase(...)