Как отсортировать записи в текстовом файле с помощью Java? - PullRequest
5 голосов
/ 12 апреля 2009

Некоторая поправка данных в текстовом файле. Я попробовал предложенный код, но я не смог написать его снова в текстовом файле с этим форматом. Я пробовал collection.sort, но он записывает данные в длинной строке.

Мой текстовый файл содержит эти данные:

Monday
Jessica  Run      20mins
Alba     Walk     20mins
Amy      Jogging  40mins
Bobby    Run      10mins
Tuesday
Mess     Run      20mins
Alba     Walk     20mins
Christy  Jogging  40mins
Bobby    Run      10mins

Как мне отсортировать эти данные в порядке возрастания и снова сохранить их в текстовом файле после сортировки?

Monday
Alba     Walk     20mins
Amy      Jogging  40mins
Bobby    Run      10mins
Jessica  Run      20mins
Tuesday
Alba     Walk     20mins
Bobby    Run      10 mins
Christy  Jogging  40mins
Mess     Run      20mins
Jessica  Run      20mins

Ответы [ 8 ]

16 голосов
/ 12 апреля 2009

Вот что я придумал:

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

public class Sort {

    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new FileReader("fileToRead"));
        Map<String, String> map=new TreeMap<String, String>();
        String line="";
        while((line=reader.readLine())!=null){
            map.put(getField(line),line);
        }
        reader.close();
        FileWriter writer = new FileWriter("fileToWrite");
        for(String val : map.values()){
            writer.write(val);  
            writer.write('\n');
        }
        writer.close();
    }

    private static String getField(String line) {
        return line.split(" ")[0];//extract value you want to sort on
    }
}
5 голосов
/ 29 июня 2013
package com.myFiles;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;

public class FilesReaderWriter {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = null;
        PrintWriter outputStream = null;
        ArrayList<String> rows = new ArrayList<String>();

        try {
            reader  = new BufferedReader(new FileReader("Input.txt"));
            outputStream = new PrintWriter(new FileWriter("Output.txt"));

            String file;
            while ((file = reader .readLine()) != null) {
                rows.add(file);
            }
            Collections.sort(rows);
            String[] strArr= rows.toArray(new String[0]);
            for (String cur : strArr)
                outputStream.println(cur);
        } finally {
            if (reader  != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }

}
4 голосов
/ 12 апреля 2009

Вот довольно ленивый способ сделать это, поскольку вы сортируете только первое слово:

    ArrayList<String> rows = new ArrayList<String>();
    BufferedReader reader = new BufferedReader(new FileReader("input.txt"));

    String s;
    while((s = reader.readLine())!=null)
        rows.add(s);

    Collections.sort(rows);

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

    reader.close();
    writer.close();
3 голосов
/ 02 октября 2010
import java.io.*;
import java.util.*;

public class Sort1 {
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new FileReader("fileToRead.txt"));
        Map<String, String> map=new TreeMap<String, String>();
        String line="";
        while((line=reader.readLine())!=null){
                map.put(getField(line),line);
        }
        reader.close();
        BufferedWriter writer = new BufferedWriter(new FileWriter("fileToWrite1.txt"));
        for(String val : map.values()){
                writer.write(val);      
                writer.newLine();
        }
        writer.close();
    }

    private static String getField(String line) {
        return line.split(" ")[0];//extract value you want to sort on
    }
}
3 голосов
/ 12 апреля 2009

Иметь класс, содержащий 3 параметра: Имя, Действие и Длина.

Откройте ваш файл для чтения, прочитайте слово за словом, для каждого человека создайте новый экземпляр класса и заполните соответствующее значение, затем вставьте этот экземпляр в некоторую коллекцию.

Сортируйте свою коллекцию, написав собственный метод сортировки или (лучший вариант) используйте одну из функций сортировки Java.

Откройте другой файл для записи и напишите свою отсортированную коллекцию в том же стиле.

если вы не можете перевести вышеупомянутые действия в код, купите книгу «Core JAVA» и прочитайте ее хорошо. Или, надеюсь, кто-то здесь проявит щедрость и даст вам полный код. :)

2 голосов
/ 12 апреля 2009

Использование sort:

aaron@ares ~$ sort data.txt 
Alba     Walk     20mins
Amy      Jogging  40mins
Bobby    Run      10mins
Jessica  Run      20mins

aaron@ares ~$ sort data.txt > sorted.txt
aaron@ares ~$ cat sorted.txt
Alba     Walk     20mins
Amy      Jogging  40mins
Bobby    Run      10mins
Jessica  Run      20mins

... или используя python:

aaron@ares ~$ python -c "import sys; print ''.join(sorted(sys.stdin))" < data.txt > sorted.txt
aaron@ares ~$ cat sorted.txt 
Alba     Walk     20mins
Amy      Jogging  40mins
Bobby    Run      10mins
Jessica  Run      20mins
1 голос
/ 20 февраля 2017

В этом решении используется Java 8 Stream API.

Учтите, что Files.write принимает Stream<CharSequence> в качестве второго аргумента, поэтому нам нужно преобразование типа через map(Function.identity()).

import java.io.IOException;
import java.nio.file.*;
import java.util.function.Function;
import java.util.stream.Stream;

public class FileSortWithStreams {

    public static void main(String[] args) throws IOException {
        Path initialFile = Paths.get("files/initial.txt");
        Path sortedFile = Paths.get("files/sorted.txt");

        Stream<CharSequence> sortedLines = Files.lines(initialFile).sorted().map(Function.identity());

        Files.write(sortedFile, sortedLines::iterator, StandardOpenOption.CREATE);
    }
}
0 голосов
/ 12 апреля 2009

Если в этом файле нет ужасного количества данных, попробуйте что-то вроде этого:

загрузить все его содержимое в

String s = <<file contents>>;

String[] strings = s.split(<<here comes lovely regex something like \w+\s\w+\s\w>>);

Arrays.sort(strings);

for (String str : strings) {
  write  str  to your output file;
}

но я слишком устал, чтобы предложить что-то более разумное ...

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