Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
fors-dnet
3 / 3 / 4
Регистрация: 11.12.2011
Сообщений: 88
#1

Не получается слить временные отсортированные файлы в один отсортированный (внешняя сортировка) - Java SE

26.10.2012, 02:45. Просмотров 581. Ответов 1
Метки нет (Все метки)

Собственно разбил, отсортировал, записал временные файлы, а вместе их слить не получается. Надеюсь на чью-то помощь:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.io.*;
import java.util.*;
 
public class MyExternalSort {
 
static long F = 10485760;
static long P = 1048576;
 
public static void main (String [] args) throws Exception {
System.out.println ("Please input the path to file: ");
BufferedReader p = new BufferedReader (new InputStreamReader (System.in));
String a = p.readLine ();
int s = (int) Math.ceil((double) F/P);
int i, j;
FileReader f = new FileReader (a);
BufferedReader b = new BufferedReader (f);
for(i=0; i<s; i++) {
TreeSet <String> tSet = new TreeSet <String> ();
for (j = 0; j < ((P < F ? P : F)/12); j++) {
String str = b.readLine();
if (str != null) {
tSet.add(str);
} else {
break;
}
}
String[] buf = new String [1048576];
tSet.toArray(buf);
tSet.clear ();
FileWriter w = new FileWriter ("D:\\ext"+i+".txt");
PrintWriter pw = new PrintWriter(w);
for (int k = 0; k < j; k++) {
if (buf [k] != null){
pw.println(buf[k]);
} else {
break;
}
}
pw.close();
w.close();
}
f.close ();
b.close ();
 
}
 
}
Если это имеет значение, то файл который нужно отсортировать является .txt и имеет такие строки в себе (рандом):
2069154
5828308
4615369
4224833
5286181
9431131
3893207
9730743
5525462
5893284
3791353
6782616
3381298
352834
4595846
3649499
5270483
904450
5541756
4699120
8618523
6717646
1781735
8467600
9527228
9069525
8535827
3769572
8107125
9081411
1087382
5689822
8074092
9630371
862203
3385465
1438164
7900772
7212811
Пробывал теми методами что тут уже предлагали в подобных темах, - у меня почему-то в финальный файл записавыет целиком отсортированный первый файл (только первый!) и далее печатает последнюю строку первого временного файла((

Добавлено через 21 час 36 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import java.io.*;
import java.util.*;
 
public class MyExternalSort {
 
static long F = 10485760;
static long P = 1048576;
 
public static void main (String [] args) throws Exception {
System.out.println ("Please input the path to file: ");
BufferedReader p = new BufferedReader (new InputStreamReader (System.in));
String a = p.readLine ();
int s = (int) Math.ceil((double) F/P);
int i, j;
FileReader f = new FileReader (a);
BufferedReader b = new BufferedReader (f);
for(i=0; i<s; i++) {
TreeSet <String> tSet = new TreeSet <String> ();
for (j = 0; j < ((P < F ? P : F)/12); j++) {
String str = b.readLine();
if (str != null) {
tSet.add(str);
} else {
break;
}
}
String[] buf = new String [1048576];
tSet.toArray(buf);
tSet.clear ();
FileWriter w = new FileWriter ("D:\\ext"+i+".txt");
PrintWriter pw = new PrintWriter(w);
for (int k = 0; k < j; k++) {
if (buf [k] != null){
pw.println(buf[k]);
} else {
break;
}
}
pw.close();
w.close();
}
f.close ();
b.close ();
 
String[] topNums = new String[s];
            BufferedReader[] brs = new BufferedReader[s];
 
            for (i = 0; i < s; i++) {
                brs[i] = new BufferedReader(new FileReader("D:\\ext"+i+".txt"));
                String t = brs[i].readLine();
                if (t != null) {
                    topNums[i] = t;
                } else {
                    continue;
                }
            }
 
            FileWriter fw = new FileWriter("D:\\FinalSortFile.txt");
            PrintWriter pw = new PrintWriter(fw);
 
            for (i = 0; i < F/12; i++) {
                String min = topNums[0];
                int minFile = 0;
 
                for (j = 0; j < s; j++) {
                    if ((min.compareTo(topNums[j])) < 0) {
                        min = topNums[j];
                        minFile = j;
                    }
                }
 
                pw.println(min);
                String t = brs[minFile].readLine();
                if (t != null) {
                    topNums[minFile] = t;
                } else {
                    continue;
                }
 
            }
            for (i = 0; i < s; i++) {
                brs[i].close();
            }
 
            pw.close();
            fw.close();
 
}
 
}
код который судя по отзывам должен работать, но у меня в итоговом файле записывает первый из отсортированных кусков, а оставшееся место заполняет последним элементом этого самого первого отсортированного куска.
Буду очень благодарен если кто-то поможет
http://www.cyberforum.ru/cmd-bat/thread1555706.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2012, 02:45
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не получается слить временные отсортированные файлы в один отсортированный (внешняя сортировка) (Java SE):

Как найти все .txt файлы и слить их содержимое в один файл?
Нужно найти и слить содержимое всех txt файлов в один txt файл. Ищу файлы...

Слить два массива в третий отсортированный по убыванию, без дублей
Даны два массива. Массив А состоит из N элементов и отсортирован по...

"Слить" вместе отсортированные массивы A и B
Помогите пожалуйста, туплю. Есть два отсортированных в порядке неубывания...

Слить один два файла в один
Подскажите как слить 1 и 2 файл в 3 файл

не получается слить разделы
Помогите! разбил штатной программой жёсткий и под системный выделил 45 гигов!...

1
aleksandy
628 / 520 / 165
Регистрация: 01.04.2010
Сообщений: 1,843
26.10.2012, 09:43 #2
Все временные файлы читаешь в один список, сортируешь его, пишешь полученный после сортировки список в файл.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 09:43
Привет! Вот еще темы с решениями:

Слить 6 видео в один
У меня есть 6 видосов, и в каждом видосе есть какие секунд 30-35 отрывка,...

Объединение массивов в один отсортированный
Задание такое: Даны два отсортированных массива: int A и int B. Объедините их...

Слить два массива в один
Помогите пожалуйста!!!! Вот все на что ума хватило. Что дальше делать не...

Слить три входных НД в один
Программа с макросами, но не в этом дело... Задание такое: Слить три входных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru