如何使用 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()方法而不是循环一次扫描一个字符...

希望对您有所帮助

首先,为什么你必须遍历一个字符串并检查一个字符是否存在,而你有很多预定义的方法可以完成这项工作,看看:

  1. .contains() Method
  2. .indexOf() Method

另外最好用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);
}