1

問題の説明は-

この場合、包含はnullであり、除外にはいくつかの値があります。したがって、一時が除外にあるかどうかを確認する必要があります。一時が除外にある場合は、何もしないか、ループから抜け出すことができますが、一時を想定します。除外されていないので、何らかのメソッドを呼び出します。これをさらに改善できるかどうかわからないので、以下に同じ機能を実装しました。私には、ブール値を使用せずにこれをさらに改善できるように見えます。メインのものはメソッドにある必要があり、それは何度も呼び出されるので

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
        }
    }
}
4

5 に答える 5

1

StringTokenizerの代わりに使用することをお勧めしString.split()ます。このスレッドで説明されているように、かなり高速です。

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
        }
    }
}
于 2012-06-05T19:01:41.907 に答える
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使用し、定数の追加変数のみを使用します。

于 2012-06-05T19:03:59.007 に答える
1
    exclusion = ";"+exclusion+";";
    temp = ";"+temp+";";

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

最初の2行は、渡された除外と一時の形式を制御できない場合にのみ必要です。質問のコードを何度も繰り返したクイックテストには1.74秒かかり、上記のコードを使用した同じテストには0.38秒かかりましたexclude と temp には、タイミング ループの反復ごとに連結された先頭と末尾のセミコロンがあります。先頭と末尾のセミコロンが既にある場合、時間は 0.07 秒に短縮されます。比較のために、一致 (正規表現) には 1.18 秒、StringTokenizer ソリューションには 0.50 秒かかります。

于 2012-06-05T19:22:46.577 に答える
0

何らかの手段で文字列を検索するのは O(N) です。a の検索HashSetは O(1) です。

使うHashSet.

于 2012-06-06T01:41:09.660 に答える
0
bExists = Arrays.asList(exclusion.split(";")).contains(temp)
于 2012-06-05T19:12:51.007 に答える