package wspp; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.*; public class WsppPos { public static void main(String[] args) { if (args.length != 2) { System.err.println("Usage: java WsppPos inputFile outputFile"); return; } String inputFile = args[0]; String outputFile = args[1]; try { // Первый проход: считаем количество слов в каждой строке WordScanner scanner = new WordScanner(inputFile); Map wordsPerLine = new HashMap<>(); while (scanner.hasNextWord()) { scanner.nextWord(); int line = scanner.getLineNumber(); wordsPerLine.put(line, wordsPerLine.getOrDefault(line, 0) + 1); } scanner.close(); // Второй проход: собираем статистику scanner = new WordScanner(inputFile); Map wordMap = new LinkedHashMap<>(); Map currentPosInLine = new HashMap<>(); while (scanner.hasNextWord()) { String word = scanner.nextWord(); int lineNum = scanner.getLineNumber(); // Позиция с начала строки int posInLine = currentPosInLine.getOrDefault(lineNum, 0) + 1; currentPosInLine.put(lineNum, posInLine); // Пересчитываем в позицию с конца строки int totalWordsInLine = wordsPerLine.get(lineNum); int posFromEnd = totalWordsInLine - posInLine + 1; if (wordMap.containsKey(word)) { WordInfo info = wordMap.get(word); info.count++; info.lineNumbers.add(lineNum); info.positions.add(posFromEnd); } else { WordInfo info = new WordInfo(); info.count = 1; info.lineNumbers = new IntList(); info.positions = new IntList(); info.lineNumbers.add(lineNum); info.positions.add(posFromEnd); wordMap.put(word, info); } } scanner.close(); // Запись результата PrintWriter writer = new PrintWriter( new OutputStreamWriter( new FileOutputStream(outputFile), StandardCharsets.UTF_8)); for (Map.Entry entry : wordMap.entrySet()) { String word = entry.getKey(); WordInfo info = entry.getValue(); writer.print(word + " " + info.count); for (int i = 0; i < info.lineNumbers.size(); i++) { writer.print(" " + info.lineNumbers.get(i) + ":" + info.positions.get(i)); } writer.println(); } writer.close(); } catch (IOException e) { System.err.println("Error: " + e.getMessage()); } } static class WordInfo { int count; IntList lineNumbers; IntList positions; } }