微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我能否进一步优化此 java 代码以减少执行时间和复杂性?

因此,我创建了两个程序(一个使用 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();
}
}

解决方法

Java 8 版本使用 Stream API 的主要区别在于对整个字符串检查两次大小写字母,并调用了两种不同的方法,而在 for-loop 中有两个 int计数器只是递增。

因此,流媒体版本可能会更改为如下所示:

int[] counts = {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++;
}

阅读关于 the fastest possible way to iterate all the characters in the string

的 SO 帖子可能会很有趣

此外,强烈建议您查看关于 correct implementation of micro benchmarks 的另一篇 SO 帖子。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。