Java 计算单词中字母的偶数和奇数

Java 计算单词中字母的偶数和奇数,java,for-loop,if-statement,Java,For Loop,If Statement,我目前正在尝试计算一个文本文件中有多少单词包含偶数和奇数字符,但我似乎无法让它工作。到目前为止,我已经做到了 int countEven = 0; int countOdd = 0; for (int i = 0; i <latinLength.length(); i++) { if (Character.isLetter(latinLength.charAt(i))) { countEven++; } els

我目前正在尝试计算一个文本文件中有多少单词包含偶数和奇数字符,但我似乎无法让它工作。到目前为止,我已经做到了

    int countEven = 0;
    int countOdd = 0;
    for (int i = 0; i <latinLength.length(); i++) {
        if (Character.isLetter(latinLength.charAt(i))) {
            countEven++;
        } else {
            countOdd++;
        }
    }
    System.out.println("Total number of unique even words in Latin names = " + countEven);
    System.out.println("Total number of unique odd words in Latin names = " + countOdd);
}
int count偶数=0;
int countOdd=0;
对于(int i=0;i)解释
目前,您只计算文本中的字母和非字母的数量。这当然不是偶数单词或奇数单词的数量

例如,如果你有一个像

test12foo!$bar
您的代码当前将被输出

countEven => 10  // Amount of letters (testfoobar)
countOdd  => 4   // Amount of non-letters (12!$)
将其与您的如果条件相比较

if (Character.isLetter(latinLength.charAt(i))) {
    countEven++;
} else {
    countOdd++;
}
你要做的是计算单词的长度是偶数还是奇数,所以假设单词的长度是

test     // length 4, even
foo      // length 3, odd
bartest  // length 7, odd
那你想要什么

countEven => 1 // (test)
countOdd  => 2 // (foo, bartest)

解决方案 相反,您需要将文本拆分为单词(标记化)。之后,您需要计算每个单词的字符数。如果是偶数,您可以将
count偶数
增加一个。同样,如果是奇数,也可以将
countOdd++
增加一个

核心将是这种情况

word.length() % 2 == 0
如果单词的长度为偶数,则为
true
;如果单词的长度为奇数,则为false。您可以自己轻松验证这一点(
%
返回除法后的余数,
0
1

让我们假设您的文本结构很简单,并且单词总是用
空格隔开,例如

test foo bar John Doe
总之,您的代码可能看起来像

Path path = Paths.get("myFile.txt");
AtomicInteger countEven = new AtomicInteger(0);
AtomicInteger countOdd = new AtomicInteger(0);
Pattern wordPattern = Pattern.compile(" ");

Files.lines(path)                         // Stream<String> lines
    .flatMap(wordPattern::splitAsStream)  // Stream<String> words
    .mapToInt(String::length)             // IntStream length
    .forEach(length -> {
        if (length % 2 == 0) {
            countEven.getAndIncrement();
        } else {
            countOdd.getAndIncrement();
        }
    });


System.out.println("Even words: " + countEven.get());
System.out.println("Odd words: " + countOdd.get());

调整到您的特定代码 由于您刚刚添加了特定的代码,我将添加一个与之相适应的解决方案

在您的代码中,列表<代码>信息>代码>包含所有<代码>鲨鱼>代码> .s。从这些鲨鱼中,您要考虑的单词是由<代码> Skky-GETLaLIN NAME> /COD>表示的。因此,您需要做的只是某种类型:

List<String> words = info.stream()  // Stream<Shark> sharks
    .map(Shark::getLatinName)       // Stream<String> names
    .collect(Collectors.toList());
并将其替换为代码中的该部分:

//count even or odd words

(substitute here)

请显示一个输入示例、所需的输出以及您的程序当前输出的内容。同时尝试创建一个示例。您并不是在做您打算做的事情。您只是在计算字母和非字母。请进一步思考问题的逻辑。您需要将文本拆分为单词(标记化)。然后,计算每个单词的字符数。如果是偶数,你可以将其增加一。如果是奇数,则将其增加一。
latinLength
对字符串来说似乎不是一个很好的名称。我只是编辑了它,而不是做line.split,因为我之前已经做过了hey had:“在每个部分之间,是否可以进行字符串[]wordsOfLine=getLatinName?或者类似的东西,因为我只想对文本文件中的一组文本执行此操作,很抱歉,如果我对我的意思的解释不清楚,不是最好的解释。当然,如果您以前这样做过,您可以完全交换文件读取和拆分部分。在某个时候,您应该e某种类型的
列出单词
准备好了吗?只要跳过我只设置该数据结构的所有内容。或者在
方法中,只需跳过前两个表达式,直接从
words.Stream().mapToInt(String::length).forEach(…)
。我的意思是,重要的部分是带有
if else
的最后一位。这决定了一个单词的长度是奇数还是偶数:
word.length()%2==0
,即使
true
和odd if
false
。到目前为止,我理解你所做的一切和所说的一切,我只是不知道如何编写它以适应我迄今为止所做的代码,我有足够的能力,但我想我做的方式有所不同?除非我看到了代码中错误的部分并进行比较?这是我比较的屏幕截图g你的代码的第一部分是,我知道你现在是怎么做的,但我不知道如何链接它来选择我的.txt文件的特定部分,我想让它说它是偶数还是奇数,因为我不想让它这样做,因为整个文本文件都包含了所有的单词吗?那么让这就是我在最后的注释。使用
Arrays.stream(data)
对于
stream
方法,另一种方法可以不经修改地工作。请注意,您读取文件的方式是传统的,现在有一种使用NIO(如我的方法所示)。
Path path = Paths.get("myFile.txt");

List<String> lines = Files.readAllLines(path);
List<String> words = new ArrayList<>();

// Read words
for (String line : lines) {
    String[] wordsOfLine = line.split(" ");
    words.addAll(Arrays.asList(wordsOfLine));
}

// Count even and odd words
int countEven = 0;
int countOdd = 0;
for (String word : words) {
    if (word.length() % 2 == 0) {
        countEven++;
    } else {
        countOdd++;
    }
}

System.out.println("Even words: " + countEven);
System.out.println("Odd words: " + countOdd);
List<String> words = info.stream()  // Stream<Shark> sharks
    .map(Shark::getLatinName)       // Stream<String> names
    .collect(Collectors.toList());
AtomicInteger countEven = new AtomicInteger(0);
AtomicInteger countOdd = new AtomicInteger(0);

info.stream()                             // Stream<Shark> sharks
    .map(Shark::getLatinName)             // Stream<String> names
    .mapToInt(String::length)             // IntStream length of names
    .forEach(length -> {
        if (length % 2 == 0) {
            countEven.getAndIncrement();
        } else {
            countOdd.getAndIncrement();
        }
    });

System.out.println("Even words: " + countEven);
System.out.println("Odd words: " + countOdd);
//count even or odd words

(substitute here)