Как я сортирую записи в текстовом файле с помощью Java?

Я думаю, что блокировка - это, по сути, единственный способ достичь этого самостоятельно, но платформа .NET должна быть в состоянии сделать это за вас, если вы используете блокирующий набор и параллельную очередь [ 112]. Коллекция Blocking дает вам реализацию модели «производитель / потребитель», которая является поточно-ориентированной.

Вот пример, который будет печатать числа по порядку.


class Program
{
    private static BlockingCollection m_BlockingCollection = new BlockingCollection(new ConcurrentQueue());
    private static int Counter;

    static async Task Main(string[] args)
    {
        Task.Run(ProcessQueue); //Don't await for this demo!
        Task.Run(AddStuffToQueue); //Don't await for this demo!

        Console.ReadLine();
        m_BlockingCollection.CompleteAdding();
        while (!m_BlockingCollection.IsAddingCompleted)
            Thread.Sleep(5);
    }

    private static void AddStuffToQueue()
    {
        while(true)
            m_BlockingCollection.Add(new Task(() => Console.WriteLine(Interlocked.Increment(ref Counter))));
    }

    private static async Task ProcessQueue()
    {
        while (!m_BlockingCollection.IsCompleted && m_BlockingCollection.TryTake(out Task task))
            ProcessTask(task);
    }

    private static void ProcessTask(Task task)
    {
        task.RunSynchronously();
    }
}

Это может быть не идеальный пример, но я уверен, что вы поняли идею. Производитель / потребитель помещает параллельную очередь в очередь, поэтому задачи выполняются как «первый пришел / первый вышел» (FIFO).

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

Надеюсь, это поможет!

5
задан Aaron Maenpaa 12 April 2009 в 04:28
поделиться

5 ответов

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

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
    }
}
16
ответ дан 18 December 2019 в 05:31
поделиться

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

    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();
4
ответ дан 18 December 2019 в 05:31
поделиться

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

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

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

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

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

.
3
ответ дан 18 December 2019 в 05:31
поделиться

Используя сортировку :

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
2
ответ дан 18 December 2019 в 05:31
поделиться

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

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

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;
}

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

0
ответ дан 18 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: