java输入一个字符串,要求将该字符串中出现的英文字母,按照顺序 进行输出,区分大小写,且大写优先?

如果广大网友发现比我第二种方式还要更好的实现,我则删帖,不服来干!

如题要求:

java输入一个字符串,要求将改字符串中出现的英文字母,按照顺序进行输出,区分大小写,且大写优先?

例如:
输入:A8r4c5ja5AJp#7
输出:AAacJjpr

实现:

第一种实现:

刚看到群里有人发出了这个题,我第一个想法就是通过排序来处理,但是单纯通过Arrays.sort();排序的话并不能完成目的。后来初步写出了第一个实现方案如下:

		String str = "as3BfAisdD4kA1";
		String result = str.chars().filter(f -> {
		    // 过滤小写
		    if (f >= 'a' && f <= 'z') {
		        return true;
		    }
		    // 过滤大写
		    return f >= 'A' && f <= 'Z';
		}).mapToObj(m -> {
		            int order = m;
		            // 如果小于a 则-32 为 大A  减去31 则跟随在大A后面,否则是前面
		            if (m >= 'a') {
		                order = m - 31;
		            }
		            return new Cla((char) m, order);
		        }
		).sorted(Comparator.comparing(Cla::getOrder)) // 排序
		        .map(m -> String.valueOf(m.data)) // 获取到对应的值
		        .collect(Collectors.joining());
		System.out.println(result);

		@AllArgsConstructor
		@Data
		class Cla {
		    public char data;
		    public int order;
		}

第二种实现:

今天吃饭途中想到,可以换一个思路实现,此思想目前发现应该是全网性能最高的存在,不服来干吧!

        String str = "as3BfAisdD4kA1";
        int[] max = new int[26];
        int[] min = new int[26];
        for (int i = 0; i < str.length(); i++) {
            int f = str.charAt(i);
            if (f >= 65 && f <= 90) {
                max[(f - 65)]++;
            } else if (f >= 97 && f <= 122) {
                min[(f - 97)]++;
            }
        }

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 26; i++) {
            int x = max[i];
            for (int j = 0; j < x; j++) {
                builder.append((char) (i + 65));
            }
            int y = min[i];
            for (int j = 0; j < y; j++) {
                builder.append((char) (i + 97));
            }
        }
        System.out.println(builder);

再优化(还有谁?):

        String str = "as3BfAisdD4kA1";
        int[] max = new int[26];
        int[] min = new int[26];
        int len = 0;
        byte[] strBytes = str.getBytes();
        for (int i = 0; i < str.length(); i++) {
            int f = strBytes[i];
            if (f >= 65 && f <= 90) {
                max[(f - 65)]++;
                len++;
            } else if (f >= 97 && f <= 122) {
                min[(f - 97)]++;
                len++;
            }
        }
        int[] newStrBytes = new int[len];
        int index = 0;
        for (int i = 0; i < 26; i++) {
            int x = max[i];
            for (int j = 0; j < x; j++) {
                newStrBytes[index++] = (i + 65);
            }
            int y = min[i];
            for (int j = 0; j < y; j++) {
                newStrBytes[index++] = (i + 97);
            }
        }
        System.out.println(new String(newStrBytes, 0, len));
更新日期:
作者: qwding, 丁乾文