Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка чисел с файла, ArrayList 
V
    Опции темы
ddj
Дата 17.3.2010, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



Суть :

в файле имеим нп : Том 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();


Нзн правильно ли смыслю, но идея моя такова. Может кто небудь смог бы помоч.. ?
--------------------
#iddj
PM MAIL   Вверх
aleksandy
Дата 17.3.2010, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 260
Регистрация: 17.12.2006

Репутация: 4
Всего: 5



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

З.Ы. SortedMap<Integer, String> нужно создавать с обратным компаратором, т.к., я смотрю, тебе нужна обратная сортировка.
PM   Вверх
powerOn
Дата 17.3.2010, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



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


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Metal_Heart
Дата 17.3.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


Профиль
Группа: Участник
Сообщений: 728
Регистрация: 31.3.2005
Где: Москва

Репутация: 4
Всего: 12



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

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



--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
batigoal
Дата 17.3.2010, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



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

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


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
ddj
Дата 18.3.2010, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



Metal_Heart
всё павно незаписывает в файл..

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

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



aleksandy
С мап неумею.. Хотелось бы с этим способом догнать до конца.
--------------------
#iddj
PM MAIL   Вверх
dobrolub
Дата 18.3.2010, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Я понимаю что сортировать надо по второму полю. Значит надо его вычленить сначала, а потом сортировать.
запускать с помощью 
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


Это сообщение отредактировал(а) dobrolub - 19.3.2010, 09:02
PM   Вверх
ddj
Дата 19.3.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



Код

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


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

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

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

--------------------
#iddj
PM MAIL   Вверх
dobrolub
Дата 19.3.2010, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



netbeans наверно не может распарсить это условие. Добавь ему скобок вокруг str.trim().isEmpty()

Код

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



PM   Вверх
ddj
Дата 20.3.2010, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



dobrolub
Цитата

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


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

Cannot find symbol
symbol :method isEmpty()
--------------------
#iddj
PM MAIL   Вверх
dobrolub
Дата 20.3.2010, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



у тебя Java 5 значит. Это метод из Java 6.
Замени на !("".equals(str.trim()))
PM   Вверх
ddj
Дата 21.3.2010, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



dobrolub

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

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

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

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


Как изменится вами написаный класс Record
--------------------
#iddj
PM MAIL   Вверх
dobrolub
Дата 21.3.2010, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Лучше на 'ты'

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

Это сообщение отредактировал(а) dobrolub - 21.3.2010, 03:13
PM   Вверх
dorogoyIV
Дата 21.3.2010, 03:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



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

задача программиста - написать как можно более универсальную программу, dobrolub это нормально реализовал.
если у тебя файлы статические, то можешь просто исправить 8 и 17 строку. вместо args [] писать имена файлов.
и запускать будешь просто: java T
PM MAIL   Вверх
ddj
Дата 21.3.2010, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 26.2.2008

Репутация: нет
Всего: 1



dorogoyIV, Так я так и сделал, но токда кидает ошибку :

Код

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


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


dobrolub, ясно, так а как переделать ?
Потомучто у меня там программа СЕРВЕР -> КЛИЕНТ
Она сама по умолчанию открывает файл сортирует и выдаёт ТОП игроков.
--------------------
#iddj
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1098 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.