Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Сортировка чисел с файла


Автор: ddj 17.3.2010, 00:49
Суть :

в файле имеим нп : Том 200
                              катя 300
                             соня 110
Надо сделать сортировку только чисел, но имена должны остаться : 
катя 300
Том 200
соня 110

Код

 BufferedReader reader = new BufferedReader(new FileReader("rez.txt"));

    Scanner inputing = new Scanner(new FileReader("rez.txt"));
        ArrayList<Integer> ret = new ArrayList<Integer>();

        while(inputing.hasNext()) {
            ret.add(Integer.parseInt(inputing.nextLine())); }

    Collections.sort(ret);

    FileWriter writer = new FileWriter("output.txt",true);
    for(Integer cur: ret)
        writer.write(cur+"\n");

    reader.close();
    writer.close();


несоздаёт почему то файла. Пробывал и вот так : 

Код

ArrayList<Integer> rows = new ArrayList<Integer>();
    BufferedReader reader = new BufferedReader(new FileReader("rez.txt"));

    int s;
    while((s = reader.readLine())!=null)      //  <------------ TUT KIDAET ERROR
        rows.add(s); 

    Collections.sort(rows);

    FileWriter writer = new FileWriter("output.txt",true);
    for(Integer cur: rows)
        writer.write(cur+"\n");

    reader.close();
    writer.close();


Нзн правильно ли смыслю, но идея моя такова. Может кто небудь смог бы помоч.. ?

Автор: aleksandy 17.3.2010, 06:08
Насколько я понимаю, все правильно сортируется smile. Т.к. ты сортируешь полностью строки. Для того, чтобы сортировать строки согласно последнего числа нужно после считывания строки ее распарсить. Потом добавить строку в SortedMap<Integer, String>, где ключом будет число из строки, а значением - сама строка.

З.Ы. SortedMap<Integer, String> нужно создавать с обратным компаратором, т.к., я смотрю, тебе нужна обратная сортировка.

Автор: powerOn 17.3.2010, 10:59
Можно создать компаратор, который выделить числа из строк и на основании сравнения этих чисел даст результат сравнения этих строк.
А сортировать через Collections.sort().

Автор: Metal_Heart 17.3.2010, 13:38
Цитата(ddj @  17.3.2010,  00:49 Найти цитируемый пост)
несоздаёт почему то файла.

попробуй добавить writer.flush(); перед writer.close();

Автор: batigoal 17.3.2010, 14:33
Цитата(ddj @  17.3.2010,  01:49 Найти цитируемый пост)
несоздаёт почему то файла. 

Может, создает, но не там, где ищешь?

Автор: ddj 18.3.2010, 23:15
Metal_Heart
всё павно незаписывает в файл..

Мне кажется что во тут что то нетак :
Код

Scanner inputing = new Scanner(new FileReader("rez.txt"));



aleksandy
С мап неумею.. Хотелось бы с этим способом догнать до конца.

Автор: dobrolub 18.3.2010, 23:46
Я понимаю что сортировать надо по второму полю. Значит надо его вычленить сначала, а потом сортировать.
запускать с помощью 
java T inputfile outputfile

Код

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

public class T {
    public static void main(String []args) throws Exception {
        ArrayList<Record> records = new ArrayList<Record>();

        BufferedReader reader = new BufferedReader(new FileReader(args[0]));
        String str;
        while ((str = reader.readLine()) != null && !str.trim().isEmpty()) {
            String []data = str.split(" ");
            records.add(new Record(data[0], Integer.parseInt(data[1])));
        }
        reader.close();

        Collections.sort(records);
        FileWriter writer = new FileWriter(args[1]);
        for (Record r : records) {
            writer.write(r.getName() + " " + r.getRating() + "\n");
        }

        writer.flush();
        writer.close();
    }
}

class Record implements Comparable<Record>{
    private String _name;
    private int _rating;

    public Record(String name, int rating) {
        _name = name;
        _rating = rating;
    }

    public String getName() {
        return _name;
    }

    public int getRating() {
        return _rating;
    }

    public int compareTo(Record r) {
        return r._rating - _rating;
    }
}


проверка результата:
Код

sort -r -t ' ' -n --key 2 inputfile

Автор: ddj 19.3.2010, 20:51
Код

while ((str = reader.readLine()) != null && !str.trim().isEmpty()) {


Operator ! cannot be applied to java.lang.string.isEmpty 

такой еррор кидает, пишу в NetBeans

И мне нелзя подавать через командноую строку файлов, так как я пишу программу СЕРВЕР -> КЛИЕНТ 
Там одна ф-я записывает имя играков и очки в файл.А вторая открывает файл -> сортирует и записывает в другой файл.

Автор: dobrolub 19.3.2010, 21:01
netbeans наверно не может распарсить это условие. Добавь ему скобок вокруг str.trim().isEmpty()

Код

while ((str = reader.readLine()) != null && !(str.trim().isEmpty())) {



Автор: ddj 20.3.2010, 20:30
dobrolub
Цитата

while ((str = reader.readLine()) != null && !(str.trim().isEmpty())) {


Всё равно непашит :/

Cannot find symbol
symbol :method isEmpty()

Автор: dobrolub 20.3.2010, 20:36
у тебя Java 5 значит. Это метод из Java 6.
Замени на !("".equals(str.trim()))

Автор: ddj 21.3.2010, 00:02
dobrolub

проблема с тем еррором исчерпана. Спасибо.
А как сделать чтобы несамому вводить название файла.
Тоесть я считываю данные всегда с файла: rez.txt
Код

BufferedReader reader = new BufferedReader(new FileReader("rez.txt"));

И записываю всегда в out.txt
Код

FileWriter writer = new FileWriter("out.txt",true);


Как изменится вами написаный класс Record

Автор: dobrolub 21.3.2010, 03:12
Лучше на 'ты'

Рекорд измениться только если формат файла  rez.txt изменить, например добавить полей или местами поменять и т.д. 

Автор: dorogoyIV 21.3.2010, 03:57
Цитата(ddj @  21.3.2010,  00:02 Найти цитируемый пост)
А как сделать чтобы несамому вводить название файла.

задача программиста - написать как можно более универсальную программу, dobrolub это нормально реализовал.
если у тебя файлы статические, то можешь просто исправить 8 и 17 строку. вместо args [] писать имена файлов.
и запускать будешь просто: java T

Автор: ddj 21.3.2010, 21:27
dorogoyIV, Так я так и сделал, но токда кидает ошибку :

Код

records.add(new Record(data[0], Integer.parseInt(data[1])));


Error: non-static variable this cannot be referenced from a static context


dobrolub, ясно, так а как переделать ?
Потомучто у меня там программа СЕРВЕР -> КЛИЕНТ
Она сама по умолчанию открывает файл сортирует и выдаёт ТОП игроков.

Автор: Metal_Heart 22.3.2010, 13:25
Цитата(ddj @  21.3.2010,  21:27 Найти цитируемый пост)
dobrolub, ясно, так а как переделать ?
Потомучто у меня там программа СЕРВЕР -> КЛИЕНТ
Она сама по умолчанию открывает файл сортирует и выдаёт ТОП игроков. 


Трудно тебе придется, потому как ты так и не понял:
Что такое args[0] и зачем он нужен?

 
Перебиваешь содержимое указанных переменных на свое значение и всё.
Код

public class T {
    public static void main(String []args) throws Exception {

       args[0]="rez.txt"
       args[1]="out.txt"

        ArrayList<Record> records = new ArrayList<Record>();
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)