代码中的性能改进

时间:2012-06-05 18:53:37

标签: java

问题陈述是 -

在这种情况下,包含为空,并且排除有一些值,所以我需要检查temp是否存在排除,如果temp在排除中然后不执行任何操作或者您可以退出循环,但是假设temp不在排除中,那么调用一些方法。我在下面实现了相同的功能,不确定我们是否可以更好地改进这个功能。因为在我看来,我可以在不使用任何布尔值的情况下进一步改进这一点。因为主要的东西需要在一个方法中,并且它将被多次调用

public static void main(String[] args) {

    String temp = "77"; // It can also be 0
    String inclusion = null;
    String exclusion = "100;77;71";
    boolean bb = false;

    if(inclusion !=null) {
        System.out.println("Site Inclusion is not null");
    } else {
        for (String exc: exclusion.split(";")) {
            if(exc.equals(temp)) {
                bb =true;
                break;
            }
        }
        if(!bb) {
            // Call some method
        }
    }
}

6 个答案:

答案 0 :(得分:1)

我建议使用StringTokenizer代替String.split()。正如this thread中所讨论的那样,速度要快得多。

public static void main(String[] args) {

    String temp = "77"; // It can also be 0
    String inclusion = null;
    String exclusion = "100;77;71";
    boolean bb = false;

    if(inclusion !=null) {
        System.out.println("Site Inclusion is not null");
    } else {
        StringTokenizer st = new StringTokenizer(exclusion, ";");
        while (st.hasMoreTokens()) {
            if (temp.equals(st.nextToken())) {
                bb = true;
                break;
            }
        }
        if(!bb) {
            // Call some method
        }
    }
}

答案 1 :(得分:1)

我能想到的最有效的实现就像是

for(int i = exclusion.indexOf(temp);
    i != -1;
    i = exclusion.indexOf(temp, i + 1)) {
  // check if it's bracketed by ; or by the end of the string
  boolean goodStart = i == 0 || exclusion.charAt(i - 1) == ';';
  boolean goodEnd = i + temp.length() == exclusion.length()
    || exclusion.charAt(i + temp.length()) == ';';
  if (goodStart && goodEnd) {
    bb = true;
    break;
  }
}

避免了正则表达式的开销,使用内置的String.indexOf,并且只使用常量的额外变量。

答案 2 :(得分:1)

    exclusion = ";"+exclusion+";";
    temp = ";"+temp+";";

    bb = exclusion.indexOf(temp) >= 0;
    if(!bb) {
        // Call some method
    }

如果您无法控制排除的格式和传入的临时值,则只需要前两行。在您的问题中对代码进行多次迭代的快速测试需要1.74秒,并且使用上面的代码执行相同的测试如果排除和临时具有与定时循环的每次迭代连接的前导和尾随分号,则为0.38秒。如果它们已经有前导和后面的分号,则时间会减少到.07秒。为了进行比较,匹配(正则表达式)需要1.18秒,而StringTokenizer解决方案需要0.50秒。

答案 3 :(得分:0)

bExists = Arrays.asList(exclusion.split(";")).contains(temp)

答案 4 :(得分:0)

通过任何方式搜索字符串是O(N)。搜索HashSet是O(1)。

使用HashSet.

答案 5 :(得分:-1)

很难说,根据您的有限帖子。 如果它们始终是整数,则排除列表不会经常更改。转换为一组int和缓存将是一个良好的开端。如果列表可以包含多于三个的成员,则可以使用已排序的集合或散列集合来快速查找包含。