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

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

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

  1. public static void readFileData() {
  2. Scanner fileInput = null;
  3. try {
  4. fileInput = new Scanner(new File("data.txt"));
  5. } catch (FileNotFoundException e) {
  6. e.printStackTrace();
  7. }
  8. while(fileInput.hasNextLine()) {
  9. String fileWords = fileInput.nextLine();
  10. System.out.println(fileWords);
  11. }
  12. }

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

  1. Swift
  2. Dotnet
  3. Java
  4. Typescript
  5. Python

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

  1. public class Sample {
  2. public void countLetters() {
  3. int count = 0;
  4. for (int i = 0; i < SampleMain.wordlist.size(); i++) {
  5. if (Character.isLetter(SampleMain.fileWords.get(i).charAt(i)- 25) >= 0 && Character.isLetter(SampleMain.fileWords.get(i) - 25) <= 25) // I'm doing it wrong
  6. SampleMain.total = count++;
  7. }
  8. }

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

uklbhaso

uklbhaso1#

tl;博士

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

  1. "Swift🦂" // SCORPION character is not a letter.
  2. .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.
  3. .filter( Character :: isLetter ) //
  4. .count()

细节

字符已过时

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

代码点流

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

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

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

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

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

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

把代码拼凑起来。

  1. String input = "Swift🦂";
  2. IntStream codePointsStream = input.codePoints();
  3. long countLetters = codePointsStream.filter( Character :: isLetter ).count();
  4. System.out.println( "input = " + input + " | countLetters: " + countLetters );

输入=swift🦂 | 信数:5

使用常规java语法

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

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

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

  1. int countLetters = 0;
  2. for ( Integer codePoint : codePoints ) {
  3. if ( Character.isLetter( codePoint ) ) { countLetters++; }
  4. }
展开查看全部
edqdpe6u

edqdpe6u2#

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

  1. import java.util.regex.Matcher;
  2. import java.util.regex.Pattern;
  3. public class HelloWorld{
  4. public static void main(String []args){
  5. int total=0;
  6. int upperCaseCount=0;
  7. Pattern letter_pattren = Pattern.compile("[a-zA-Z]");
  8. Pattern upperCase_pattern=Pattern.compile("[A-Z]");
  9. String data="Swift\nDotnet\nJava\nTypescript\nPython";
  10. String[] lines =data.split("\n");
  11. for (String line : lines){
  12. Matcher letterMatcher = letter_pattren.matcher(line);
  13. while (letterMatcher.find()) {
  14. total++;
  15. }
  16. letterMatcher = upperCase_pattern.matcher(line);
  17. while (letterMatcher.find()) {
  18. upperCaseCount++;
  19. }
  20. }
  21. System.out.println("Total letter count:"+total);
  22. System.out.println("Upper Case letter Count:"+upperCaseCount);
  23. }
  24. }

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

展开查看全部

相关问题