我可以进一步优化此java代码以减少执行时间和复杂性吗?

r7s23pms  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(305)

因此,我创建了两个程序(一个使用java8)来计算给定字符串中大小写字符的总数。检查执行时间后,java8的执行时间比预期的要长。是否有任何可能的方法来进一步优化这些代码以减少执行时间和复杂性???
代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Counts
{
public static void main(String arg[])throws Exception
{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int upperCase=0, lowerCase=0;
    String str=br.readLine();
    Long startTimeMemo = System.nanoTime();
    for (int k = 0; k < str.length(); k++) {
// Check for uppercase letters.
if (Character.isUpperCase(str.charAt(k))) upperCase++;
// Check for lowercase letters.
if (Character.isLowerCase(str.charAt(k))) lowerCase++;
}

System.out.printf("%d uppercase letters and %d lowercase letters.",upperCase,lowerCase);
Long stopTimeMemo = System.nanoTime();
    System.out.println("");
    System.out.println("Memoization Time:" + (stopTimeMemo - startTimeMemo));
}
}

java8代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Count2
{
    public static void main(String arg[])throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        Long startTimeMemo = System.nanoTime();
        System.out.println(countUpperCase(str) + " " + countLowerCase(str));    
        Long stopTimeMemo = System.nanoTime();
        System.out.println("");
        System.out.println("Memoization Time:" + (stopTimeMemo - startTimeMemo));
    }
    private static long countUpperCase(String s) {
    return s.codePoints().filter(c-> c>='A' && c<='Z').count();
}

private static long countLowerCase(String s) {
    return s.codePoints().filter(c-> c>='a' && c<='z').count();
}
}
rkue9o1l

rkue9o1l1#

使用流api的Java8版本的主要区别在于,整个字符串检查了两次小写和大写字母,并且在 for-loop 2 int 计数器只是递增的。
因此,流媒体版本可能会更改为以下内容:

int[] counts = {0, 0, 0};
str.codePoints()
   .map(c -> Character.isUpperCase(c) ? 0 : 
             Character.isLowerCase(c) ? 1 : 2)
   .forEach(i -> counts[i]++);

System.out.printf("%d uppercase letters and %d lowercase letters.%n", counts[0], counts[1]);

关于 for-loop 实现时,可以进行以下微优化,尽管编译器应提供这些优化:
计算字符串长度并获取当前字符一次
使用 else 增加 lowerCase 柜台

for (int k = 0, n = str.length(); k < n; k++) {
    char c = str.charAt(k);
    if (Character.isUpperCase(c)) upperCase++;
    else if (Character.isLowerCase(c)) lowerCase++;
}

读一篇关于迭代字符串中所有字符的最快方法的文章可能会很有趣
另外,强烈建议您查看另一篇关于正确实施微观基准的so帖子。

相关问题