1

オブジェクトの配列があります。オブジェクトにgetCountry()があります。getCountry()が「XXX」と等しいときにフラグを設定したいと思います。

知っているように、私はやっています、

boolean isXXX=false;
if(custAcctArray != null)
{
    for(int index=0;index<custAcctArray.length;index++)
    {
        if(custAcctArray[i].getCountry().equalsIgnoreCase("XXX"))
        {
            isXXX=true;
        }
    }
}

if(isXXX)
{
    Do something about it....
}

配列が約100個または奇数のオブジェクトで満たされていると仮定すると、どういうわけかこのロジックは気に入らない。誰かが効率的な方法で最終出力を達成する他の方法に光を当てたり、光を当てたりすることはできますか? 私が欲しいもの:getCountry() ==" XXX "のときにフラグを設定します

4

2 に答える 2

3

たぶん、配列の代わりにマップを使用してください。マップは国からオブジェクトにマップする必要があります。次に、キーがマップに存在するかどうかを確認します。

私の頭のてっぺんからのもう1つのアイデアは、toString()そのクラスのメソッドをオーバーライドして使用することですArrays.toString(custAcctArray).contains("XXX")(または、正規表現を使用したより信頼性の高い検索)。しかし、それは回避策のように見えます。(これはかなり悪い考えです。コード内のループを取り除くためのトリッキーな方法と考えてください。)

編集:私の考えを要約します。配列を初期化するときに値「XXX」がわかっている場合、または国の値の並列セットを使用する場合は、マップの代わりにブールフラグ(私のコメントを参照)を使用する必要があると思います。HashSet(効率O(1))を使用します。この場合、クラスのメソッドequals()とメソッドをオーバーライドする必要があります。hashCode()TreeSetの効率は低くなりますが(O(log(n)))、ここではコンパレータを使用するかComparable、クラスにインターフェイスを実装します。

編集:ただし、この場合はStringオブジェクトがあるため、何も実装する必要はありません(、、hashCode()およびequals()compareTo()そこで実装されます)。

于 2012-08-12T15:49:34.243 に答える
3
boolean isXXX=false;
if(custAcctArray != null)
{
    for(int index=0;index<custAcctArray.length;index++)
    {
        if(custAcctArray[i].getCountry().equalsIgnoreCase("XXX"))
        {
            isXXX=true;
            break;//<-------------you need to exit to be quick and true solution!!!!
        }
}
}

if(isXXX)
{
Do something about it....
}

休憩が見えますか。?これは、できるだけ早く大きなループを終了します。そうしないと、次の反復で他の値に設定される可能性があります。

オブジェクトの外部にある「個別の」配列を使用して、オブジェクトにすばやくアクセスすることもできます(境界チェックが1つ少なくなります)。

より良い方法:国の値を設定するときは、「xxx」の場合は「チェック」アルゴリズムを使用せずにすぐにisXXXを設定することを確認してください:)

于 2012-08-12T15:53:15.643 に答える