如何在java中编写(并修复)没有循环的代码

如何在java中编写(并修复)没有循环的代码,java,loops,if-statement,switch-statement,Java,Loops,If Statement,Switch Statement,我只是想知道如何在没有任何循环的情况下将此代码切换到另一个代码,但仍然保持它的功能。仅在以下情况下使用\开关 并修复它,实际上它似乎是有效的 public static int countWords(String s){ int wordCount = 0; boolean word = false; int endOfLine = s.length() - 1; for (int i = 0; i < s.length(); i++) {

我只是想知道如何在没有任何循环的情况下将此代码切换到另一个代码,但仍然保持它的功能。仅在以下情况下使用\开关
并修复它,实际上它似乎是有效的

  public static int countWords(String s){

    int wordCount = 0;

    boolean word = false;
    int endOfLine = s.length() - 1;

    for (int i = 0; i < s.length(); i++) {
        // if the char is a letter, word = true.
        if (Character.isLetter(s.charAt(i)) && i != endOfLine) {
            word = true;
            // if char isn't a letter and there have been letters before,
            // counter goes up.
        } else if (!Character.isLetter(s.charAt(i)) && word) {
            wordCount++;
            word = false;
            // last word of String; if it doesn't end with a non letter, it
            // wouldn't count without this.
        } else if (Character.isLetter(s.charAt(i)) && i == endOfLine) {
            wordCount++;
        }
    }
    return wordCount;
}

我不确定你原来的问题是什么,但似乎你的问题可以通过用替换函数来解决

return s.split(" ").length

如果我理解得很好,我可以用以下两种情况来总结您的算法:

对前面有单词字符的所有非单词字符进行计数 如果字符串以字母结尾,则递增计数器。 通过使用具有适当模式的String.split函数,可以明确地在没有循环的情况下实现

可以有很多解决方案,但只是给您一个想法,下面是一个实现示例,其中我使用所有字母字符模式\\p{Alpha}+拆分字符串。 如果字符串以字符串数组的非单词第一个元素开头,计数器将递减。 此外,如果验证了案例n.2,计数器将递增。 您可以看到您的实现方法countWords和我的方法countWordsNoLoop之间的区别:


没有任何循环,但仍保持其功能。仅在不可能的情况下使用\开关。但是您可以返回s.split\\s+.length;试试s.split\\PL+,它在任何非字符上拆分字符串s。它实际上似乎可以工作,然后发布一条消息,告诉我们它是如何工作的work@A.B你能解释一下你想要实现什么吗?例如,我使用字符串aaddrr12345运行您的代码;结果我得到了2。为什么?你想数数什么?@A.B例如,在字符串中我尝试了aaddrr12345;2C i在字符串的中间计数7个非字母,最后加上一个字母,所以预期结果是8,为什么你期望2?
import java.util.regex.Pattern;

public class WordCounter {
    public static void main(String args[]) {
        String test1 = "aaddrr12345;2C";
        String test2 = "1111aaddrr12345;2C";
        String test3 = "aaaaa7877sssss1111aaddrr12345;2C";
        
        
        System.out.println("Counter " + test1 + " with loop: " + countWords(test1));
        System.out.println("Counter " + test1 + " without loop: " + countWordsNoLoop(test1));
        System.out.println();
        System.out.println("Counter " + test2 + " with loop: " + countWords(test2));
        System.out.println("Counter " + test2 + " without loop: " + countWordsNoLoop(test2));
        System.out.println();
        System.out.println("Counter " + test3 + " with loop: " + countWords(test3));
        System.out.println("Counter " + test3 + " without loop: " + countWordsNoLoop(test3));
    }
    
    public static int countWordsNoLoop(String s){
        String[] splitString =  s.split("\\p{Alpha}+");
        
        int wordCount = (s.startsWith(splitString[0]) ? splitString.length - 1 : splitString.length) + 
                        (Character.isLetter(s.charAt(s.length()-1)) ? 1 : 0 );

        return wordCount;
    }
    
    
    
    public static int countWords(String s){

        int wordCount = 0;
    
        boolean word = false;
        int endOfLine = s.length() - 1;
    
        for (int i = 0; i < s.length(); i++) {
            // if the char is a letter, word = true.
            if (Character.isLetter(s.charAt(i)) && i != endOfLine) {
                word = true;
                // if char isn't a letter and there have been letters before,
                // counter goes up.
            } else if (!Character.isLetter(s.charAt(i)) && word) {
                wordCount++;
                word = false;
                // last word of String; if it doesn't end with a non letter, it
                // wouldn't count without this.
            } else if (Character.isLetter(s.charAt(i)) && i == endOfLine) {
                wordCount++;
            }
        }
        return wordCount;
    }
}
Counter aaddrr12345;2C with loop: 2
Counter aaddrr12345;2C without loop: 2

Counter 1111aaddrr12345;2C with loop: 2
Counter 1111aaddrr12345;2C without loop: 2

Counter aaaaa7877sssss1111aaddrr12345;2C with loop: 4
Counter aaaaa7877sssss1111aaddrr12345;2C without loop: 4