Я думаю, что блокировка - это, по сути, единственный способ достичь этого самостоятельно, но платформа .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).
Можно иметь несколько потребителей для блокирующего сбора, но если вы хотите, чтобы все обрабатывалось по одному, тогда достаточно одного потребителя, как продемонстрировано.
Надеюсь, это поможет!
Вот что я придумал:
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
}
}
Вот довольно ленивый способ сделать это, поскольку вы сортируете только первое слово:
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 параметра: имя, действие и длина.
Откройте ваш файл для чтения, читайте слово за словом, для каждого человека создайте новый экземпляр класса и заполните соответствующее значение, затем вставьте этот экземпляр в некоторую коллекцию.
Отсортируйте коллекцию либо написав собственный метод сортировки, либо (лучший вариант) используя одну из функций сортировки Java.
Откройте другой файл для записи и запишите отсортированную коллекцию в том же стиле.
если вы не можете перевести вышеуказанные действия в код, купите книгу "Core JAVA" и хорошо ее прочитайте. Или надейтесь, что кто-то здесь будет щедр и даст вам полный код. :)
. Используя сортировку
:
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
Если в этом файле нет ужасного количества данных, попробуйте что-то вроде этого:
загрузите все его содержание в
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;
}
, но я слишком устал, чтобы предложить что-то более разумное ...