如何计算每行中出现的单词中的字母,单词中是否出现a…z

7gyucuyw  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(344)

我通过练习一些基本程序来学习java。我有一个名为samplemain.java的类文件,我在其中每行读取一个文本文件,并将其存储在名为filewords的变量中。
samplemain.java中的代码-

public static void readFileData() {

        Scanner fileInput = null;

        try {
            fileInput = new Scanner(new File("data.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        while(fileInput.hasNextLine()) {
            String fileWords = fileInput.nextLine();
            System.out.println(fileWords);
        }
    }

这将打印我的data.txt值,如下所示-

Swift
Dotnet
Java
Typescript
Python

我有另一个类文件sample1.java,我想在其中做以下事情。
计算字符串中单词(filewords)的字母总数,并将其存储在另一个名为total的变量中,在该变量中,我还希望检查文件是否不应有任何垃圾值。
使用filewords中单词的大写版本,它应该计算单词中a、b、…、z的数量。
我已经编写了如下代码-sample1.java

public class Sample {

     public void countLetters() {
       int count = 0;
       for (int i = 0; i < SampleMain.wordlist.size(); i++) {
            if (Character.isLetter(SampleMain.fileWords.get(i).charAt(i)- 25) >= 0 && Character.isLetter(SampleMain.fileWords.get(i) - 25) <= 25) // I'm doing it wrong
                SampleMain.total = count++;
        }
    }

有人能在这里指导我吗?我在迭代时做错了什么?我如何纠正这一点以获得上述计数。

uklbhaso

uklbhaso1#

tl;博士

使用代码点整数,不要过时 char 类型。

"Swift🦂"                         // SCORPION character is not a letter.
.codePoints()                     // Generate a stream of `int` primitive values, one for each character in our input string. Represents the code point number assigned to this character by the Unicode Consortium.
.filter( Character :: isLetter )  // 
.count()

细节

字符已过时

这个 char 类型在java中已过时,甚至无法表示unicode中定义的一半字符。学习使用代码点整数代替。

代码点流

你可以得到源源不断的信息 int 原始值 IntStream ,表示字符串中每个字符的代码点。

IntStream codePointsStream = "Swift🦂".codePoints() ;

显然,您希望重点关注字母与数字、标点符号等。因此,根据unicode定义,通过测试字符是否为字母进行筛选。

long countLetters = codePointsStream.filter( codePoint -> Character.isLetter( codePoint ) ).count();

我们可以通过使用方法引用来缩短代码。

long countLetters = codePointsStream.filter( Character :: isLetter ).count();

把代码拼凑起来。

String input = "Swift🦂";
IntStream codePointsStream = input.codePoints();
long countLetters = codePointsStream.filter( Character :: isLetter ).count();

System.out.println( "input = " + input + " | countLetters: " + countLetters );

输入=swift🦂 | 信数:5

使用常规java语法

如果您还不熟悉lambda、streams和方法引用,我们可以通过转换 IntStream 将代码点整数转换为 List .
呼吁 boxed() 皈依 int 将原始值转换为 Integer 对象在称为“装箱”的过程中。

List< Integer > codePoints = "Swift🦂".codePoints().boxed().toList() ;  // Before Java 16, replace that `.toList()` with `.collect(Collectors.toList())`.

循环列表,检查每个元素。如果它通过了字母的测试,增加你的计数器。

int countLetters = 0;
for ( Integer codePoint : codePoints ) {
    if ( Character.isLetter( codePoint ) ) { countLetters++; }
}
edqdpe6u

edqdpe6u2#

我正在使用正则表达式解决您的问题,示例代码如下:

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HelloWorld{

     public static void main(String []args){
        int total=0;
        int upperCaseCount=0;
        Pattern letter_pattren = Pattern.compile("[a-zA-Z]");
        Pattern upperCase_pattern=Pattern.compile("[A-Z]");
        String data="Swift\nDotnet\nJava\nTypescript\nPython";
        String[] lines =data.split("\n");
        for (String line : lines){
            Matcher letterMatcher = letter_pattren.matcher(line);
            while (letterMatcher.find()) {
                total++;
            }
            letterMatcher = upperCase_pattern.matcher(line);
            while (letterMatcher.find()) {
                upperCaseCount++;
            }
        }
        System.out.println("Total letter count:"+total);
        System.out.println("Upper Case letter Count:"+upperCaseCount);
     }
}

有关详细信息,请参阅此链接。

相关问题