From 86978ea70a78a48082e2fe51066aeec086e93f06 Mon Sep 17 00:00:00 2001 From: codejava Date: Mon, 13 Apr 2026 10:43:14 +0300 Subject: [PATCH] Upload files to "java/wspp" --- java/wspp/IntList.java | 44 +++++++++++++ java/wspp/WordInfo.java | 25 +++++++ java/wspp/Wspp.java | 80 +++++++++++++++++++++++ java/wspp/WsppLast.java | 127 ++++++++++++++++++++++++++++++++++++ java/wspp/package-info.java | 7 ++ 5 files changed, 283 insertions(+) create mode 100644 java/wspp/IntList.java create mode 100644 java/wspp/WordInfo.java create mode 100644 java/wspp/Wspp.java create mode 100644 java/wspp/WsppLast.java create mode 100644 java/wspp/package-info.java diff --git a/java/wspp/IntList.java b/java/wspp/IntList.java new file mode 100644 index 0000000..81fdfcd --- /dev/null +++ b/java/wspp/IntList.java @@ -0,0 +1,44 @@ +package wspp; + +import java.util.Arrays; + +/** + * @author Nikita Doschennikov (me@fymio.us) + */ +public class IntList { + + protected int[] list = new int[8]; + protected int idx = 0; + + public IntList() {} + + public void put(int val) { + if (idx >= list.length) { + list = Arrays.copyOf(list, list.length * 2); + } + + list[idx++] = val; + } + + public int getLength() { + return idx; + } + + public int get(int index) { + return list[index]; + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < idx; i++) { + if (i == idx - 1) { + sb.append(String.valueOf(list[i]) + "\n"); + } else { + sb.append(String.valueOf(list[i]) + " "); + } + } + + return sb.toString(); + } +} diff --git a/java/wspp/WordInfo.java b/java/wspp/WordInfo.java new file mode 100644 index 0000000..bbbd1af --- /dev/null +++ b/java/wspp/WordInfo.java @@ -0,0 +1,25 @@ +package wspp; + +import java.util.*; + +/** + * @author Nikita Doschennikov (me@fymio.us) + */ +public class WordInfo { + + final String word; + int firstOccurrence; + + IntList occurrences = new IntList(); + + Map lineOccurrences = new HashMap<>(); + + public WordInfo(String word) { + this.word = word; + } + + public WordInfo(String word, int firstOccurrence) { + this.word = word; + this.firstOccurrence = firstOccurrence; + } +} diff --git a/java/wspp/Wspp.java b/java/wspp/Wspp.java new file mode 100644 index 0000000..93d9b13 --- /dev/null +++ b/java/wspp/Wspp.java @@ -0,0 +1,80 @@ +package wspp; + +import java.io.*; +import java.util.*; + +/** + * @author Nikita Doschennikov (me@fymio.us) + */ +public class Wspp { + + public static void main(String[] args) { + if (args.length != 2) { + System.err.println( + "usage: java Wspp " + ); + } + + final String inputFileName = args[0]; + final String outputFileName = args[1]; + + Map words = new LinkedHashMap<>(); + + try ( + BufferedReader br = new BufferedReader( + new FileReader(inputFileName) + ); + FileWriter fw = new FileWriter(outputFileName) + ) { + String line; + int wordPos = 1; + while ((line = br.readLine()) != null) { + line = line.toLowerCase(); + StringBuilder word = new StringBuilder(); + + for (char c : line.toCharArray()) { + if ( + Character.isLetter(c) || + c == '\'' || + Character.getType(c) == Character.DASH_PUNCTUATION + ) { + word.append(c); + } else { + if (!word.isEmpty()) { + if (words.containsKey(word.toString())) { + words + .get(word.toString()) + .occurrences.put(wordPos++); + } else { + WordInfo info = new WordInfo(word.toString()); + info.occurrences.put(wordPos++); + words.put(word.toString(), info); + } + } + + word = new StringBuilder(); + } + } + + if (!word.isEmpty()) { + if (words.containsKey(word.toString())) { + words.get(word.toString()).occurrences.put(wordPos++); + } else { + WordInfo info = new WordInfo(word.toString()); + info.occurrences.put(wordPos++); + words.put(word.toString(), info); + } + } + } + + for (String word : words.keySet()) { + WordInfo info = words.get(word); + int count = info.occurrences.getLength(); + String occurencies = info.occurrences.toString(); + fw.write(word + " " + count + " " + occurencies); + } + } catch (IOException e) { + System.out.println("Error reading file."); + } + } +} diff --git a/java/wspp/WsppLast.java b/java/wspp/WsppLast.java new file mode 100644 index 0000000..e755954 --- /dev/null +++ b/java/wspp/WsppLast.java @@ -0,0 +1,127 @@ +package wspp; + +import java.io.*; +import java.util.*; + +/** + * @author Nikita Doschennikov (me@fymio.us) + */ +public class WsppLast { + + public static void main(String[] args) { + if (args.length != 2) { + System.err.println( + "usage: java WsppPosition " + ); + } + + final String inputFileName = args[0]; + final String outputFileName = args[1]; + + Map words = new LinkedHashMap<>(); + + try ( + BufferedReader br = new BufferedReader( + new FileReader(inputFileName) + ); + FileWriter fw = new FileWriter(outputFileName) + ) { + String line; + int wordPos = 1; + int lineNumber = 1; + while ((line = br.readLine()) != null) { + line = line.toLowerCase(); + StringBuilder word = new StringBuilder(); + + for (char c : line.toCharArray()) { + if ( + Character.isLetter(c) || + c == '\'' || + Character.getType(c) == Character.DASH_PUNCTUATION || + Character.isDigit(c) || + c == '$' || + c == '_' + ) { + word.append(c); + } else { + if (!word.isEmpty()) { + if (words.containsKey(word.toString())) { + var lO = words.get( + word.toString() + ).lineOccurrences; + if (lO.containsKey(lineNumber)) { + lO.get(lineNumber).put(wordPos++); + } else { + var intList = new IntList(); + intList.put(wordPos++); + lO.put(lineNumber, intList); + } + } else { + WordInfo info = new WordInfo( + word.toString(), + wordPos + ); + var intList = new IntList(); + intList.put(wordPos++); + info.lineOccurrences.put(lineNumber, intList); + words.put(word.toString(), info); + } + } + + word = new StringBuilder(); + } + } + + if (!word.isEmpty()) { + if (words.containsKey(word.toString())) { + var lO = words.get(word.toString()).lineOccurrences; + if (lO.containsKey(lineNumber)) { + lO.get(lineNumber).put(wordPos++); + } else { + var intList = new IntList(); + intList.put(wordPos++); + lO.put(lineNumber, intList); + } + } else { + WordInfo info = new WordInfo(word.toString(), wordPos); + var intList = new IntList(); + intList.put(wordPos++); + info.lineOccurrences.put(lineNumber, intList); + words.put(word.toString(), info); + } + } + + lineNumber++; + } + + List sortedWords = new ArrayList<>(words.values()); + sortedWords.sort( + Comparator.comparingInt((WordInfo w) -> + w.word.length() + ).thenComparingInt(w -> w.firstOccurrence) + ); + + for (WordInfo info : sortedWords) { + int totalNumberOfOccurrences = 0; + var lO = info.lineOccurrences; + String word = info.word; + for (int key : lO.keySet()) { + totalNumberOfOccurrences += lO.get(key).getLength(); + } + + fw.write(word + " " + totalNumberOfOccurrences); + + for (int key : lO.keySet()) { + var occurrences = lO.get(key); + + fw.write( + " " + occurrences.get(occurrences.getLength() - 1) + ); + } + fw.write("\n"); + } + } catch (IOException e) { + System.out.println("Error reading file."); + } + } +} diff --git a/java/wspp/package-info.java b/java/wspp/package-info.java new file mode 100644 index 0000000..9938d04 --- /dev/null +++ b/java/wspp/package-info.java @@ -0,0 +1,7 @@ +/** + * Tests for Word Statistics++ homework + * of Introduction to Programming course. + * + * @author Georgiy Korneev (kgeorgiy@kgeorgiy.info) + */ +package wspp;