如何使用 main class 中方法打印的输出?
How to use the output that is printed by a method in the main class?
我正在做一个单词搜索项目,这个程序获取一个文本文件作为输入,第一种方法 scanVocabulary
创建一个包含文本中前 3000 个单词的数组。第二种方法 printWords
得到 scanVocabulary
和三个字母的输出,它 return 是按插入顺序包含三个字母的单词。
当我 运行 我的程序时,我可以说 scanVocabulary
有效,因为我得到了我插入的文本的正确长度,但是当我 运行 printWords
我根本没有得到输出。
我的方法应该打印输出而不是 return。那么我应该如何获得输出呢?
我认为问题出在 main 方法中。
这是我的代码:
package sw1.ex4;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class WordSearch {
public static String[] scanVocabulary(Scanner scanner) {
int counter = 0;
String[] result = new String[3000];
while (scanner.hasNext() && counter < 3000) {
String word = scanner.next().toLowerCase();
if (isAlpha(word) && word.length() > 0
&& !checkOccurance(word, result)) {
result[counter] = word;
counter++;
}
}
if (counter < 3000) {
result = clean(result);
}
return result;
}
public static String[] clean(final String[] v) {
List<String> list = new ArrayList<String>(Arrays.asList(v));
list.removeAll(Collections.singleton(null));
return list.toArray(new String[list.size()]);
}
public static boolean isAlpha(String name) {
char[] chars = name.toCharArray();
for (char c : chars) {
if (!Character.isLetter(c)) {
return false;
}
}
return true;
}
public static boolean checkOccurance(String word, String[] array) {
for (String str : array)
if (str != null) {
if (str.equals(word))
return true;
}
return false;
}
public static void printWords(String[] vocabulary,
String firstLetter, String secondLetter, String thirdLetter){
int counter=0;
for (String str : vocabulary){
int index1=0;
int index2=0;
int index3=0;
if (str.contains(firstLetter))
index1=str.indexOf(firstLetter);
if ((str.substring(index1, str.length())).contains(secondLetter))
index2=str.indexOf(secondLetter);
if ((str.substring(index2, str.length())).contains(thirdLetter))
index3=str.indexOf(thirdLetter);
if (index3>index2 & index2>index1){
System.out.println(str);
counter++;
}
else
System.out.println(index1 +"," + index2 +","+index3);
}
System.out.println("found "+ counter+" words");
}
public static void main(String[] args) throws FileNotFoundException{
File theFile = new File(args[0]);
Scanner s = new Scanner(theFile);
String[] wordslist = scanVocabulary(s);
System.out.println("Read " +wordslist.length+" words from "+args[0]); //check if args[0] is ok
System.out.println("Enter 3 letters or exit");
Scanner input = new Scanner(System.in);
while (input.hasNextLine()) {
String line = input.nextLine();
if(line.equals("exit"))
break;
if (line.length()!=5)
System.out.println("[WARNING] Expecting 3 letters separated by one space");
if (Character.isLetter(line.charAt(0)) && Character.isLetter(line.charAt(2)) && Character.isLetter(line.charAt(4)) )
continue;
else
System.out.println("[WARNING] Expecting 3 letters separated by one space");
String first = String.valueOf(line.charAt(0));
String second = String.valueOf(line.charAt(2));
String third = String.valueOf(line.charAt(4));
printWords(wordslist,first,second,third);
}
input.close();
}
}
输入有效性后,如果使用 continue 进行检查使循环寻找下一个输入,则将其删除。
package sw1.ex4;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class WordSearch {
public static String[] scanVocabulary(Scanner scanner) {
int counter = 0;
String[] result = new String[3000];
while (scanner.hasNext() && counter < 3000) {
String word = scanner.next().toLowerCase();
if (isAlpha(word) && word.length() > 0
&& !checkOccurance(word, result)) {
result[counter] = word;
counter++;
}
}
if (counter < 3000) {
result = clean(result);
}
return result;
}
public static String[] clean(final String[] v) {
List<String> list = new ArrayList<String>(Arrays.asList(v));
list.removeAll(Collections.singleton(null));
return list.toArray(new String[list.size()]);
}
public static boolean isAlpha(String name) {
char[] chars = name.toCharArray();
for (char c : chars) {
if (!Character.isLetter(c)) {
return false;
}
}
return true;
}
public static boolean checkOccurance(String word, String[] array) {
for (String str : array)
if (str != null) {
if (str.equals(word))
return true;
}
return false;
}
public static void printWords(String[] vocabulary,
String firstLetter, String secondLetter, String thirdLetter){
int counter=0;
for (String str : vocabulary){
char[] letters = str.toCharArray();
int index2=0;
int index3=0;
if (firstLetter.charAt(0)==letters[0]){
for(int i=1; i<letters.length;i++){
if(secondLetter.charAt(0)==letters[i]){
index2 = i;
}
if(thirdLetter.charAt(0)==letters[i]){
index3 = i;
}
}
if (index2<index3){
counter++;
System.out.println(str);
}
}
continue;
}
System.out.println("found "+ counter+" words");
}
public static void main(String[] args) throws FileNotFoundException{
File theFile = new File(args[0]);
Scanner s = new Scanner(theFile);
String[] wordslist = scanVocabulary(s);
System.out.println("Read " +wordslist.length+" words from "+args[0]); //check if args[0] is ok
System.out.println("Enter 3 letters or exit");
Scanner input = new Scanner(System.in);
while (input.hasNextLine()) {
String line = input.nextLine();
if(line.equals("exit"))
break;
if (line.length()!=5)
System.out.println("[WARNING] Expecting 3 letters separated by one space");
if (Character.isLetter(line.charAt(0)) && Character.isLetter(line.charAt(2)) && Character.isLetter(line.charAt(4)) )
System.out.println("Valid Input :) ");
else
System.out.println("[WARNING] Expecting 3 letters separated by one space");
String first = String.valueOf(line.charAt(0));
String second = String.valueOf(line.charAt(2));
String third = String.valueOf(line.charAt(4));
printWords(wordslist,first,second,third);
}
input.close();
}
}
我最好的猜测是 if (firstLetter.charAt(0)==letters[0]){
永远不会是真的。
尝试使用 .equals()
方法。
其他评论:我会使用.contains()
方法而不是循环一次扫描一个字符...
希望对您有所帮助
首先,为什么你必须遍历一个字符串并检查一个字符是否存在,而你有很多预定义的方法可以完成这项工作,看看:
另外最好用char.compareTo(char) method比较两个字符,所以改成:
if (firstLetter.charAt(0)==letters[0])
具有以下内容:
if (firstLetter.charAt(0).compareTo(letters[0]))
编辑:
更改您的测试并直接比较索引 firstletter
、索引 secondletter
和索引 thirdletter
,如下所示:
if (str.contains(firstLetter)) {
index1=str.indexOf(firstLetter);
if (str.contains(secondLetter) && str.indexOf(secondLetter)>index1){
index2=str.indexOf(secondLetter);
if (str.contains(thirdLetter) && str.indexOf(thirdLetter)> index2) {
System.out.println(str);
counter++;
}
}
}
并注意 AND
运算符在 java 中是 &&
而不是 &
。
编辑2:
并且为了保证在输入两次的情况下搜索到另一个出现的字母,可以将找到的字母替换为0
,这样如果下一个字母相同,第一次出现的将被删除但未找到,因此如果再次出现,您可以获得下一个索引:
if (str.contains(firstLetter)) {
index1=str.indexOf(firstLetter);
str=str.substring(0,index1)+'0'+str.substring(index1+1);
if (str.contains(secondLetter) && str.indexOf(secondLetter)>index1){
index2=str.indexOf(secondLetter);
str=str.substring(0,index2)+'0'+str.substring(index2+1);
if (str.contains(thirdLetter) && str.indexOf(thirdLetter)> index2) {
System.out.println(str);
counter++;
}
}
}
您需要创建一些负责打印的单例 class。
想法是有一个用于打印的静态函数,打印时,该函数会将打印的字符串附加到某个 ArrayList 或附加到保存所有打印值的 StringBuffer。
然后你可以实现一些其他的静态方法来搜索你需要的东西。
public class SystemPritingSingleton {
private static SystemPritingSingleton ins = null;
private static StringBuffer sb = new StringBuffer();
private SystemPritingSingleton(){}
private static SystemPritingSingleton getInstance(){
if (ins == null){
synchronized (SystemPritingSingleton.class) {
if (ins == null){
ins = new SystemPritingSingleton();
}
}
}
return ins;
}
public static void printMessage(String message){
getInstance();
System.out.println(message);
sb.append(message);
}
public static boolean searchMessage(String message){
getInstance();
return (sb.toString().indexOf(message) != -1);
}
}
用法:
public static void main (String[] args){
String msg = "printMessage";
SystemPritingSingleton.printMessage(msg);
boolean isExist = SystemPritingSingleton.searchMessage(msg);
.
.
}
我认为在你的 main
方法中 continue
声明错位了
if (Character.isLetter(line.charAt(0)) && Character.isLetter(line.charAt(2)) && Character.isLetter(line.charAt(4)) )
continue;
当满足此条件时,您必须调用 printWords
方法,但 continue 语句会执行并绕过它下面的所有语句,包括您的 printWords
方法语句,这就是您没有获得任何输出的原因。
你应该在这里调用printWords
方法:-
if (Character.isLetter(line.charAt(0)) && Character.isLetter(line.charAt(2)) && Character.isLetter(line.charAt(4)) )
{
String first = String.valueOf(line.charAt(0));
String second = String.valueOf(line.charAt(2));
String third = String.valueOf(line.charAt(4));
printWords(wordslist,first,second,third);
}
我正在做一个单词搜索项目,这个程序获取一个文本文件作为输入,第一种方法 scanVocabulary
创建一个包含文本中前 3000 个单词的数组。第二种方法 printWords
得到 scanVocabulary
和三个字母的输出,它 return 是按插入顺序包含三个字母的单词。
当我 运行 我的程序时,我可以说 scanVocabulary
有效,因为我得到了我插入的文本的正确长度,但是当我 运行 printWords
我根本没有得到输出。
我的方法应该打印输出而不是 return。那么我应该如何获得输出呢?
我认为问题出在 main 方法中。
这是我的代码:
package sw1.ex4;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class WordSearch {
public static String[] scanVocabulary(Scanner scanner) {
int counter = 0;
String[] result = new String[3000];
while (scanner.hasNext() && counter < 3000) {
String word = scanner.next().toLowerCase();
if (isAlpha(word) && word.length() > 0
&& !checkOccurance(word, result)) {
result[counter] = word;
counter++;
}
}
if (counter < 3000) {
result = clean(result);
}
return result;
}
public static String[] clean(final String[] v) {
List<String> list = new ArrayList<String>(Arrays.asList(v));
list.removeAll(Collections.singleton(null));
return list.toArray(new String[list.size()]);
}
public static boolean isAlpha(String name) {
char[] chars = name.toCharArray();
for (char c : chars) {
if (!Character.isLetter(c)) {
return false;
}
}
return true;
}
public static boolean checkOccurance(String word, String[] array) {
for (String str : array)
if (str != null) {
if (str.equals(word))
return true;
}
return false;
}
public static void printWords(String[] vocabulary,
String firstLetter, String secondLetter, String thirdLetter){
int counter=0;
for (String str : vocabulary){
int index1=0;
int index2=0;
int index3=0;
if (str.contains(firstLetter))
index1=str.indexOf(firstLetter);
if ((str.substring(index1, str.length())).contains(secondLetter))
index2=str.indexOf(secondLetter);
if ((str.substring(index2, str.length())).contains(thirdLetter))
index3=str.indexOf(thirdLetter);
if (index3>index2 & index2>index1){
System.out.println(str);
counter++;
}
else
System.out.println(index1 +"," + index2 +","+index3);
}
System.out.println("found "+ counter+" words");
}
public static void main(String[] args) throws FileNotFoundException{
File theFile = new File(args[0]);
Scanner s = new Scanner(theFile);
String[] wordslist = scanVocabulary(s);
System.out.println("Read " +wordslist.length+" words from "+args[0]); //check if args[0] is ok
System.out.println("Enter 3 letters or exit");
Scanner input = new Scanner(System.in);
while (input.hasNextLine()) {
String line = input.nextLine();
if(line.equals("exit"))
break;
if (line.length()!=5)
System.out.println("[WARNING] Expecting 3 letters separated by one space");
if (Character.isLetter(line.charAt(0)) && Character.isLetter(line.charAt(2)) && Character.isLetter(line.charAt(4)) )
continue;
else
System.out.println("[WARNING] Expecting 3 letters separated by one space");
String first = String.valueOf(line.charAt(0));
String second = String.valueOf(line.charAt(2));
String third = String.valueOf(line.charAt(4));
printWords(wordslist,first,second,third);
}
input.close();
}
}
输入有效性后,如果使用 continue 进行检查使循环寻找下一个输入,则将其删除。
package sw1.ex4;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class WordSearch {
public static String[] scanVocabulary(Scanner scanner) {
int counter = 0;
String[] result = new String[3000];
while (scanner.hasNext() && counter < 3000) {
String word = scanner.next().toLowerCase();
if (isAlpha(word) && word.length() > 0
&& !checkOccurance(word, result)) {
result[counter] = word;
counter++;
}
}
if (counter < 3000) {
result = clean(result);
}
return result;
}
public static String[] clean(final String[] v) {
List<String> list = new ArrayList<String>(Arrays.asList(v));
list.removeAll(Collections.singleton(null));
return list.toArray(new String[list.size()]);
}
public static boolean isAlpha(String name) {
char[] chars = name.toCharArray();
for (char c : chars) {
if (!Character.isLetter(c)) {
return false;
}
}
return true;
}
public static boolean checkOccurance(String word, String[] array) {
for (String str : array)
if (str != null) {
if (str.equals(word))
return true;
}
return false;
}
public static void printWords(String[] vocabulary,
String firstLetter, String secondLetter, String thirdLetter){
int counter=0;
for (String str : vocabulary){
char[] letters = str.toCharArray();
int index2=0;
int index3=0;
if (firstLetter.charAt(0)==letters[0]){
for(int i=1; i<letters.length;i++){
if(secondLetter.charAt(0)==letters[i]){
index2 = i;
}
if(thirdLetter.charAt(0)==letters[i]){
index3 = i;
}
}
if (index2<index3){
counter++;
System.out.println(str);
}
}
continue;
}
System.out.println("found "+ counter+" words");
}
public static void main(String[] args) throws FileNotFoundException{
File theFile = new File(args[0]);
Scanner s = new Scanner(theFile);
String[] wordslist = scanVocabulary(s);
System.out.println("Read " +wordslist.length+" words from "+args[0]); //check if args[0] is ok
System.out.println("Enter 3 letters or exit");
Scanner input = new Scanner(System.in);
while (input.hasNextLine()) {
String line = input.nextLine();
if(line.equals("exit"))
break;
if (line.length()!=5)
System.out.println("[WARNING] Expecting 3 letters separated by one space");
if (Character.isLetter(line.charAt(0)) && Character.isLetter(line.charAt(2)) && Character.isLetter(line.charAt(4)) )
System.out.println("Valid Input :) ");
else
System.out.println("[WARNING] Expecting 3 letters separated by one space");
String first = String.valueOf(line.charAt(0));
String second = String.valueOf(line.charAt(2));
String third = String.valueOf(line.charAt(4));
printWords(wordslist,first,second,third);
}
input.close();
}
}
我最好的猜测是 if (firstLetter.charAt(0)==letters[0]){
永远不会是真的。
尝试使用 .equals()
方法。
其他评论:我会使用.contains()
方法而不是循环一次扫描一个字符...
希望对您有所帮助
首先,为什么你必须遍历一个字符串并检查一个字符是否存在,而你有很多预定义的方法可以完成这项工作,看看:
另外最好用char.compareTo(char) method比较两个字符,所以改成:
if (firstLetter.charAt(0)==letters[0])
具有以下内容:
if (firstLetter.charAt(0).compareTo(letters[0]))
编辑:
更改您的测试并直接比较索引 firstletter
、索引 secondletter
和索引 thirdletter
,如下所示:
if (str.contains(firstLetter)) {
index1=str.indexOf(firstLetter);
if (str.contains(secondLetter) && str.indexOf(secondLetter)>index1){
index2=str.indexOf(secondLetter);
if (str.contains(thirdLetter) && str.indexOf(thirdLetter)> index2) {
System.out.println(str);
counter++;
}
}
}
并注意 AND
运算符在 java 中是 &&
而不是 &
。
编辑2:
并且为了保证在输入两次的情况下搜索到另一个出现的字母,可以将找到的字母替换为0
,这样如果下一个字母相同,第一次出现的将被删除但未找到,因此如果再次出现,您可以获得下一个索引:
if (str.contains(firstLetter)) {
index1=str.indexOf(firstLetter);
str=str.substring(0,index1)+'0'+str.substring(index1+1);
if (str.contains(secondLetter) && str.indexOf(secondLetter)>index1){
index2=str.indexOf(secondLetter);
str=str.substring(0,index2)+'0'+str.substring(index2+1);
if (str.contains(thirdLetter) && str.indexOf(thirdLetter)> index2) {
System.out.println(str);
counter++;
}
}
}
您需要创建一些负责打印的单例 class。
想法是有一个用于打印的静态函数,打印时,该函数会将打印的字符串附加到某个 ArrayList 或附加到保存所有打印值的 StringBuffer。
然后你可以实现一些其他的静态方法来搜索你需要的东西。
public class SystemPritingSingleton {
private static SystemPritingSingleton ins = null;
private static StringBuffer sb = new StringBuffer();
private SystemPritingSingleton(){}
private static SystemPritingSingleton getInstance(){
if (ins == null){
synchronized (SystemPritingSingleton.class) {
if (ins == null){
ins = new SystemPritingSingleton();
}
}
}
return ins;
}
public static void printMessage(String message){
getInstance();
System.out.println(message);
sb.append(message);
}
public static boolean searchMessage(String message){
getInstance();
return (sb.toString().indexOf(message) != -1);
}
}
用法:
public static void main (String[] args){
String msg = "printMessage";
SystemPritingSingleton.printMessage(msg);
boolean isExist = SystemPritingSingleton.searchMessage(msg);
.
.
}
我认为在你的 main
方法中 continue
声明错位了
if (Character.isLetter(line.charAt(0)) && Character.isLetter(line.charAt(2)) && Character.isLetter(line.charAt(4)) )
continue;
当满足此条件时,您必须调用 printWords
方法,但 continue 语句会执行并绕过它下面的所有语句,包括您的 printWords
方法语句,这就是您没有获得任何输出的原因。
你应该在这里调用printWords
方法:-
if (Character.isLetter(line.charAt(0)) && Character.isLetter(line.charAt(2)) && Character.isLetter(line.charAt(4)) )
{
String first = String.valueOf(line.charAt(0));
String second = String.valueOf(line.charAt(2));
String third = String.valueOf(line.charAt(4));
printWords(wordslist,first,second,third);
}