有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用由主类中的方法打印的输出?

我正在做一个单词搜索项目,这个程序得到一个文本文件作为输入,第一个方法scanVocabulary创建一个包含文本中前3000个单词的数组。第二个方法printWords获取scanVocabulary和三个字母的输出,它按插入顺序返回包含这三个字母的单词

当我运行我的程序时,我可以判断scanVocabulary是有效的,因为我得到了插入的文本的正确长度,但是当我运行printWords时,我根本没有得到输出

我的方法应该打印输出,而不是返回它。那么我应该如何获得输出呢

我认为问题在于主要方法

这是我的代码:

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

}

}

共 (5) 个答案

  1. # 1 楼答案

    首先,当您有许多预定义的方法可以完成这项工作时,为什么必须在字符串上循环并检查字符是否存在,请看:

    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中是&&,而不是&

    EDIT2:

    并且,为了保证在输入两次的情况下搜索字母的另一次出现,您可以将找到的字母替换为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++;
               }
            }
        }
    
  2. # 2 楼答案

    我认为在你的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);
    }
    
  3. # 3 楼答案

    输入有效后,如果使用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();
    
        }
    
        }
    
  4. # 4 楼答案

    我最好的猜测是if (firstLetter.charAt(0)==letters[0]){永远不会是真的

    尝试使用.equals()方法

    其他注释:我将使用.contains()方法,而不是一次循环扫描一个字符

    希望这有帮助

  5. # 5 楼答案

    您需要创建一些负责打印的单例类

    其思想是有一个用于打印的静态函数,在打印时,该函数会将打印的字符串附加到某个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);
        .
        .       
    }