В приведенном ниже коде используется java stream API . Код создает поток строк из каждого файла. Он читает первый файл и создает Map
, где ключ карты - это имя, которое отображается в файле, а значение карты - это число (которое отображается в файле рядом с именем). Затем он читает второй файл и объединяет данные во втором файле в существующую карту.
РЕДАКТИРОВАТЬ
В исходном коде (ниже) я забыл обработать часть, в которой вы хотите записать полученную карту в файл. Я добавил это под комментарием Added in edit
. Я создаю List
строк из карты и записываю этот список в новый файл.
/* Required imports:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;
*/
Path path1st = Paths.get("path-to-first-file");
Path path2nd = Paths.get("path-to-second-file");
Function<String, String> keyMapper = str -> {
String key = null;
if (str != null && str.indexOf('-') >= 0) {
String[] parts = str.split("-");
if (parts.length == 2) {
key = parts[0];
}
}
return key;
};
Function<String, Integer> valueMapper = str -> {
Integer value = null;
if (str != null && str.indexOf('-') >= 0) {
String[] parts = str.split("-");
if (parts.length == 2) {
try {
value = Integer.valueOf(parts[1]);
}
catch (NumberFormatException x) {
// Ignore.
}
}
}
return value == null ? Integer.valueOf(0) : value;
};
BinaryOperator<Integer> mergeFunction = (first, second) -> {
int one = first == null ? 0 : first.intValue();
int two = second == null ? 0 : second.intValue();
return Integer.valueOf(one + two);
};
try {
Map<String, Integer> theMap = Files.lines(path1st)
.collect(Collectors.toMap(keyMapper, valueMapper));
Map<String, Integer> totals = Files.lines(path2nd)
.collect(Collectors.toMap(keyMapper, valueMapper, mergeFunction, () -> theMap));
System.out.println(totals);
// Added in edit
List<String> lines = totals.entrySet()
.stream()
.map(entry -> String.format("%s-%s", entry.getKey(), entry.getValue()))
.collect(Collectors.toList());
Files.write(Paths.get("path-to-new-file"),
lines,
StandardOpenOption.CREATE,
StandardOpenOption.WRITE);
//
}
catch (IOException x) {
x.printStackTrace();
}
Выполнение вышеуказанного кода на предоставленных вами образцах данных выводит следующее содержимое карты:
{carlos=400, james=50, john=104}