Upload files to "java/wspp"

This commit is contained in:
2026-04-13 10:43:14 +03:00
parent fd8fc4b768
commit 86978ea70a
5 changed files with 283 additions and 0 deletions

44
java/wspp/IntList.java Normal file
View File

@@ -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();
}
}

25
java/wspp/WordInfo.java Normal file
View File

@@ -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<Integer, IntList> lineOccurrences = new HashMap<>();
public WordInfo(String word) {
this.word = word;
}
public WordInfo(String word, int firstOccurrence) {
this.word = word;
this.firstOccurrence = firstOccurrence;
}
}

80
java/wspp/Wspp.java Normal file
View File

@@ -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 <inputFilePath> <outputFilePath>"
);
}
final String inputFileName = args[0];
final String outputFileName = args[1];
Map<String, WordInfo> 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.");
}
}
}

127
java/wspp/WsppLast.java Normal file
View File

@@ -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 <inputFilePath> <outputFilePath>"
);
}
final String inputFileName = args[0];
final String outputFileName = args[1];
Map<String, WordInfo> 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<WordInfo> 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.");
}
}
}

View File

@@ -0,0 +1,7 @@
/**
* Tests for <a href="https://www.kgeorgiy.info/courses/prog-intro/homeworks.html#wspp">Word Statistics++</a> homework
* of <a href="https://www.kgeorgiy.info/courses/prog-intro/">Introduction to Programming</a> course.
*
* @author Georgiy Korneev (kgeorgiy@kgeorgiy.info)
*/
package wspp;