Как использовать Java для сортировки фамилий в алфавитном порядке от файла к файлу? - PullRequest
0 голосов
/ 17 января 2011

Я написал этот код и не знаю, как сортировать фамилии в алфавитном порядке из моего файла в другой файл.

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 ]

3 голосов
/ 17 января 2011

Вы должны простить меня, если я сделаю некоторые неверные предположения, так как я не говорю по-литовски ??поэтому ваши переменные и имена методов затрудняют мне понимание вашего кода.

Похоже, у вас есть собственная структура связанного списка записей «Персона».Есть несколько способов сортировки записей по фамилии.Одним из способов было бы написать метод сортировки связанного списка путем ручного перемещения узлов и разрыва / воссоздания ссылок между вашими узлами.

Другой способ - выгрузить ваш список в стандартный список и отсортировать список, используя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<Asmuo> data = sortList();
for (Asmuo a : data) {
    // write to file, etc...
}

Удачи!и дайте мне знать, если какое-либо из моих предположений неверно, чтобы я мог изменить свой ответ.

2 голосов
/ 17 января 2011

Хотя у меня нет конкретного комментария по поводу этого кода, потому что, честно говоря, мне очень трудно читать, учитывая мое непонимание языка, который вы используете, в качестве общего подхода, это то, как я бы решилпроблема, которую вы спрашиваете:

  1. Создайте тип List для хранения списка имен / данных / и т. Д., Используя класс POJO для хранения данных.Я часто использую тип LinkedList, если я не знаю длину списка заранее, или ArrayList, если я знаю, сколько элементов заранее.
  2. Считать ВСЕ данные из файла 1 в этот Список объектов.
  3. Создайте класс, который реализует Comparator с универсальным указанием вашего класса POJOЭтот класс, где вы делаете сравнение имен, чтобы проверить порядок.Вы также можете использовать метод String Java Java Compare или CompareIgnoreCase, чтобы java выполнял сравнение имен за вас.
  4. Передайте список и эту реализацию Comparator Arrays.sort
  5. Запишите свой списокотсортированные объекты Java.

Это работает для любого типа объектов Java случайно, и метод сортировки может быть совершенно произвольным или основываться на некоторой новой характеристике данных.Я использую такую ​​методологию нередко, и поскольку Java делает большую часть тяжелой работы за вас, она минимизирует ваши затраты времени и усилий.Нет смысла заново изобретать колесо, когда у Java уже есть хороший, готовый к использованию.

0 голосов
/ 17 января 2011

Я удивлен, что ни один из ответов не предложил использовать Collator в этом случае. Поэтому я просто хочу добавить, что вы должны использовать Collator для сравнения, как показано ниже

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

Полный пример можно найти здесь


Отредактировано с подсказкой для использования в коде RD01

Добавьте метод сравнения (), доступный в Collator, вместо equalsIgnoreCase (...) в примере кода, предоставленного RD01

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...