java - 如何删除 char 数组中的空白位置?

标签 java arrays

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;

public class Testtest{

    public static void main(String[] args){
        String einString = Terminal.askString("String: ");
        String[] arrayWord = einString.split("");
        char[] arrayChar = einString.toCharArray();
        char[] count = new char[arrayChar.length];
        int[] number = new int[count.length];

        for(int i=0; i<arrayWord.length; i++){

            if((byte)arrayChar[i]>64&&(byte)arrayChar[i]<91){
                count[i] = arrayChar[i];
                if((byte)arrayChar[i]>96&&(byte)arrayChar[i]<123){
                    for(int j=i+1; j<count.length-1; j++){
                        count[j] = count[j+1];
                    }
                    break;
                }
            }
            System.out.println(count[i]);
        }
        System.out.println(count.length);
    }
}

Image

因此,我只想获取用户输入字符串时大写字母的数量。但正如您在图片中看到的,我成功删除了 Alphabet 的小写字母,但问题是它仍然是一个空的地方。所以当我使用 .length 时,这些都会被计算在内。我应该做什么?

最佳答案

我不确定我是否理解代码中的所有内容(例如,内部循环有什么用?)。 如果您只想在字符串中保留大写字符,可以使用流。给定一个字符串 s,您有两个相关的流:s.chars()s.codePoints():

public class StringTest {
    private static String filterUpperCase1(String s) {
        return s.chars().filter(Character::isUpperCase)
                             .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                             .toString();
    }

    private static String filterUpperCase2(String s) {
        int[] a = s.chars().filter(Character::isUpperCase).toArray();
        return new String(a, 0, a.length);
    }

    private static String filterUpperCase3(String s) {
        return s.codePoints().filter(Character::isUpperCase)
                             .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
                             .toString();
    }

    private static String filterUpperCase4(String s) {
        int[] a = s.codePoints().filter(Character::isUpperCase).toArray();
        return new String(a, 0, a.length);
    }

    public static void main(String[] args) {
        String s = "AaBbCc𝐀𝐚𝐁𝐛𝐂𝐜";
        System.out.println(filterUpperCase1(s));
        System.out.println(filterUpperCase2(s));
        System.out.println(filterUpperCase3(s));
        System.out.println(filterUpperCase4(s));
    }
}

输出将是:

ABC
ABC
ABC𝐀𝐁𝐂
ABC𝐀𝐁𝐂

此处 filterUpperCase1filterUpperCase2 说明了使用 char(而不是代码点)可能发生的问题。通过在代码中使用String.toCharArray(),您也会遇到同样的问题。

请注意,前六个字符是 ASCII 字母,后六个字符是 mathematical characters BMP之外.

char 是一个 16 位值,可能等于也可能不等于字符(仅适用于 BMP 中的字符),而代码点可以对任何 Unicode 字符进行编码。这里我不考虑combining charactersequivalence .

这里,filterUpperCase1filterUpperCase2 中存在一个额外的错误,因为 Character.isUpperCase(int) 需要一个代码点,但为了调用 Character.isUpperCase(char) 而转换为 char 不会更改输出。

关于java - 如何删除 char 数组中的空白位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59345871/

相关文章:

java - 如何获取 .jsp(portlet)的 URL?

javascript - 我可以在 javascript 中将数组附加到 'formdata' 吗?

c - 为二维数组分配空间时程序卡住

arrays - 按 Int 打乱结构

java - 如何停止此代码中的闪烁

java - 如何在Java中以递增的周期重复运行任务?

javascript - 合并和重新排序两个对象数组的问题

c++ - 在 C++ 中 : How to overwrite an element to an array by moving entries below it up by one

java - 什么 Web UI 框架最适合构建动态页面/表单?

java - Spring 存储库还保存了我不想保存的对象