我创造了一个类似的词查找器的乐趣。(word.txt是来自http://www.mieliestronk.com/corncob_lowercase.txt的单词)有什么方法可以让这个词更好或者更准确?
import java.util.*;
import java.io.*;
class Main {
public static void print(String text, int times) {
for (int i = 0; i < times; i++) {
System.out.print(text);
}
}
public static void println(String text, int times) {
for (int i = 0; i < times; i++) {
System.out.println(text);
}
}
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList();
try {
BufferedReader reader = new BufferedReader(new FileReader("word.txt"));
String line = null;
while ((line = reader.readLine()) != null) {
arrayList.add(line);
}
println("Welcome to similar word finder. This program searches 58100 different words for words that are similar to the word that you entered",1);
print("Enter a word: ", 1);
Scanner scanner = new Scanner(System.in);
String checkWord = scanner.nextLine();
for (int i = 0; i < checkWord.length(); i++) {
// checks whether the character is not a letter
// if it is not a letter ,it will return false
if ((Character.isLetter(checkWord.charAt(i)) == false)) {
println("Your word contains a not-unicode letter!",1);
System.exit(1);
}
}
ArrayList<String> similarwords = new ArrayList<>();
print("How strict do you want the search to be? (1) Very Strict (2) Normal strict (3) Not very strict: ",1);
String strict = scanner.nextLine();
//println(arrayList.toString(),1);
int minus = 0;
if (strict == "1") {
minus = 1;
} else {
if (strict=="2") {
minus = 2;
} else {
if (strict=="3") {
minus = 3;
} else {
minus =2;
}
}
}
int timesRight = 0;
int timesRight2 = 0;
if (checkWord.length() > 3) {
timesRight2 = checkWord.length()-minus;
println("Similar Words:", 1);
} else {
if (checkWord.length() > 2) {
timesRight2=checkWord.length();
}else {
timesRight=2;
}
}
checkWord = checkWord.trim();
try {
String[] letters = checkWord.split("");
for (String word3 : arrayList) {
timesRight=0;
String[] letters2 = word3.split("");
int under = 0;
if (letters.length<=letters2.length) {
under = letters.length;
} else {
under = letters2.length;
}
for(int i = 0; i < under;i++) {
if (letters2[i].equals(letters[i])) {
timesRight++;
} else {
if(i<letters2.length-2 && i<letters.length-2){
if (letters2[i+1].equals(letters[i])) {
timesRight++;
}
}
}
}
if (timesRight>timesRight2) {
if
if (word3 != checkWord) {
//System.out.println(checkWord);
similarwords.add(word3);
println(word3 +" #" + similarwords.size() , 1);
}else {
println(word3 + " (search word)",1);
}
} else {
//println("x",1);
}
}
} catch (Exception e) {
System.err.println("Error!: " + e);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}发布于 2021-02-25 10:30:40
如果你想要你的单词匹配更准确,查找Soundex匹配。
我致力于让你的代码更容易被普通人读懂。
我不知道你是怎么匹配单词的。我假设你是根据字母差异数来选择单词的。
通常,当您编写Java类时,它应该读起来像一篇文章。最重要的信息在开始时,随着代码的深入,您会看到越来越多的细节。我们称之为方法的一口大小的食物。
几乎所有的代码都在一个主要的方法中。您的代码对我来说很难理解,就像我说的,我放弃了试图理解您是如何比较单词的,而只是编写了我自己的代码。
下面是我写的查找类似单词的主要方法。
public void findSimilarWords() {
List<String> wordList = readWordList();
Scanner scanner = new Scanner(System.in);
String checkword = readWord(scanner);
int level = readStrictLevel(scanner);
List<String> matchingWords = findMatchingWords(
wordList, checkword, level);
createOutput(checkword, matchingWords);
scanner.close();
}七行代码。现在,我们还不知道细节。我们知道有一个单词列表,我们从控制台得到一个单词和一个匹配级别,然后输出匹配的单词。在这一点上,这就是我们需要知道的。
我们将在进一步阅读类代码时获得详细信息。
我想我已经表达了自己的观点。这是修改后的代码。我希望您发现这段代码更容易理解,更重要的是,更容易修改。代码不仅仅是计算机的代码。人类也必须阅读和理解代码。包括时间过去之后的你。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class SimilarWordFinder {
public static void main(String[] args) {
SimilarWordFinder swf = new SimilarWordFinder();
swf.findSimilarWords();
}
public void findSimilarWords() {
List<String> wordList = readWordList();
Scanner scanner = new Scanner(System.in);
String checkword = readWord(scanner);
int level = readStrictLevel(scanner);
List<String> matchingWords = findMatchingWords(
wordList, checkword, level);
createOutput(checkword, matchingWords);
scanner.close();
}
private List<String> readWordList() {
List<String> wordList = new ArrayList<>();
try {
URL url = new URL("http://www.mieliestronk.com/"
+ "corncob_lowercase.txt");
BufferedReader reader = new BufferedReader(
new InputStreamReader(url.openStream()));
String line = reader.readLine();
while (line != null) {
wordList.add(line.trim());
line = reader.readLine();
}
reader.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return wordList;
}
private String readWord(Scanner scanner) {
println("Welcome to similar word finder. This program "
+ "searches 58,100 different words for words that "
+ "are similar to the word that you entered",
1);
boolean invalidWord = true;
String checkWord = "";
while (invalidWord) {
print("Enter a word: ", 1);
checkWord = scanner.nextLine();
invalidWord = false;
for (int i = 0; i < checkWord.length(); i++) {
// checks whether the character is not a letter
// if it is not a letter ,it will return false
if (!Character.isLetter(checkWord.charAt(i))) {
println("Your word contains a not-unicode letter!", 1);
invalidWord = true;
break;
}
}
}
return checkWord;
}
private int readStrictLevel(Scanner scanner) {
print("How strict do you want the search to be? (1) Very "
+ "Strict (2) Normal strict (3) Not very strict: ",
1);
String strict = scanner.nextLine();
return valueOf(strict);
}
private List<String> findMatchingWords(List<String> wordList,
String word, int level) {
List<String> similarWords = new ArrayList<>();
for (String matchWord : wordList) {
if (matchWord.length() == word.length()) {
int difference = calculateWordDifference(word, matchWord);
if (difference <= level) {
similarWords.add(matchWord);
}
}
}
return similarWords;
}
private int calculateWordDifference(String word, String matchWord) {
int difference = 0;
for (int i = 0; i < word.length(); i++) {
if (word.charAt(i) != matchWord.charAt(i)) {
difference++;
}
}
return difference;
}
private void createOutput(String word, List<String> matchingWords) {
println(" ", 1);
println("The following words match \"" + word + "\"", 1);
println(" ", 1);
for (String matchingWord : matchingWords) {
println(" " + matchingWord, 1);
}
}
private void print(String text, int times) {
for (int i = 0; i < times; i++) {
System.out.print(text);
}
}
private void println(String text, int times) {
for (int i = 0; i < times; i++) {
System.out.println(text);
}
}
private int valueOf(String number) {
try {
return Integer.valueOf(number);
} catch (NumberFormatException e) {
return 2;
}
}
}https://codereview.stackexchange.com/questions/256421
复制相似问题