Я работаю над проектом, который требует от меня найти минимальное связующее дерево для данного графа в Java. Я настоящий новичок в Java, так как в основном использую C++.
Я написал алгоритм, но есть уникальный тип входного формата, который выглядит примерно так:
0 1:33 2:0 3:12 4:29 5:32 6:22 7:13 8:45 9:21
1 0:6 2:18 3:2 4:26 5:41 6:8 7:47 8:13 9:19
2 0:22 1:28 3:49 4:47 5:5 6:16 7:32 8:5 9:34
3 0:21 1:24 2:2 4:29 5:20 6:39 7:17 8:21 9:3
4 0:27 1:20 2:38 3:4 5:14 6:25 7:0 8:24 9:11
5 0:20 1:7 2:29 3:15 4:3 6:19 7:11 8:19 9:41
6 0:14 1:36 2:6 3:45 4:18 5:33 7:43 8:22 9:36
7 0:25 1:12 2:15 3:45 4:18 5:43 6:41 8:37 9:26
8 0:29 1:44 2:23 3:15 4:34 5:45 6:27 7:29 9:4
9 0:18 1:41 2:20 3:25 4:18 5:10 6:10 7:49 8:42
или, точнее:
[source-vertex] [destination-vertex]:[weight] [destination-vertex]:[weight] ...
Что я хотел бы знать, так это как я могу прочитать такой формат ввода?
Я думал читать каждую строку до конца файла, а затем анализировать числа из каждой строки.
Итак, есть ли проблемы с кодом, который вы пробовали до сих пор (который читает файл, а затем анализирует его)?
Начиная с Java 8, вы можете использовать Files.readAllLines
(попробуйте и вернитесь к нам, если вы столкнулись с какой-либо проблемой)
Да, вы должны делать это так, как вы думаете, давайте покажем, что вы уже сделали.
@Shark Я этого еще не пробовал, потому что не знаком с синтаксисом. Я ищу разные источники, чтобы узнать, как я могу это сделать сейчас.
@Thoomas Я попробую, спасибо!
Расширьте абстрактный класс Reader, используя BufferedReader в качестве модели. Включите символы разделителя строк.
@Thoomas Это работает, спасибо, но у меня есть еще вопрос. Поскольку входной файл может быть довольно большим, есть ли способ читать по одной строке за раз и не сохранять целые строки в списке?
@hiimsoba Вы можете использовать BufferedReader
: docs.oracle.com/javase/7/docs/api/java/nio/file/…
Я бы предложил использовать Steam API и загрузить ваш файл с помощью BufferedReader и спеть метод lines (). Это приводит к потоку, которым вы можете манипулировать по своему усмотрению.
Итак, у вас в основном есть два вопроса:
Reader
и прочитать с InputStream
с соответствующим текстом кодирование, используя попробовать с ресурсами.Код для чтения данных в соответствии с вашим форматом:
File f = ... // file to read
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8))) {
// regular expression checking the format of each line
Pattern linePattern = Pattern.compile("(\\d+)(?:\\s+(\\d+):(\\d+))*");
// regular expression to find the index (first number) in a line
Pattern indexPattern = Pattern.compile("(\\d+)");
// regular expression to find the vertices (a:b) in a line
Pattern relationPattern = Pattern.compile("(\\d+):(\\d+)");
String line;
while ((line = reader.readLine()) != null) {
if (linePattern.matcher(line).matches()) {
Matcher indexMatcher = indexPattern.matcher(line);
if (indexMatcher.find()) {
int sourceVertex = Integer.parseInt(indexMatcher.group(1));
// do something with the sourceVertex
Matcher relationMatcher = relationPattern.matcher(line);
while (relationMatcher.find()) {
int destinationVertex = Integer.parseInt(relationMatcher.group(1));
int weight = Integer.parseInt(relationMatcher.group(2));
// do something with destinationVertex and weight
}
}
}
}
}
что ты уже испробовал?