1

タイプのコレクションをトラバースするコードを作成しようとしていますInstallationComponentSetup:

java.util.Collection<InstallationComponentSetup> components= context.getInstallationComponents();
Iterator it = components.iterator();
while (it.hasNext())
{
    if (((InstallationComponentSetup)it).getName() == "ACQ")
    {
         return true;   
    }
}

-statementのキャストはif失敗しますが、その理由はよくわかりません (私は C++ プログラマーです!)。

私が間違っていることについて誰かが私にいくつかの指針を与えることができれば、私は感謝します.

4

8 に答える 8

2

比較する場合は、メソッドStringを使用してください。equals()キャストさえ間違っていnext()ます。次の要素を取得するには、イテレータで呼び出す必要があります。したがってit.next()、のオブジェクトになる次の要素が得られますが、型InstallationComponentSetupitはないInstallationComponentSetupため、キャストは失敗します。

Iteratorここでは、失敗するクラス タイプに をキャストしています。

if (((InstallationComponentSetup)it).getName() == "ACQ")
{
     return true;   
}

Collection特定のタイプの要素を保持するように定義したため、また特定のタイプの を宣言する場合は、ここでキャストする必要はないと思いますIterator。あなたは簡単に行うことができます:

// define Iterator of InstallationComponentSetup
Iterator<InstallationComponentSetup> it = components.iterator();
if("ACQ".equals(it.next().getName())) {
   return true;
}

for要素の読み取りのみが目的の場合は、Java で拡張ループを使用することも検討できます。

 for(InstallationComponentSetup component: components) {
      if("ACQ".equals(component.getName())) {
       return true;
   }
 }
于 2013-07-08T14:06:50.850 に答える
1

比較する前に、反復の次の要素を取得する必要があります。

InstallationComponentSetup next = it.next();
        if (next.getName() == "ACQ")
        {
             return true;   
        }
于 2013-07-08T14:10:33.693 に答える
1

次のコードを使用してみてください。より簡潔で理解しやすくなっています。

Collection<InstallationComponentSetup> components= context.getInstallationComponents();
for(InstallationComponentSetup comp : components){
    if("ACQ".equals(comp.getName()){
        return;
    }
}

コードに 2 つの問題があったと思います。

  1. イテレータをオブジェクトにキャストしても、そのようには機能しません。オブジェクトを取得して反復子を移動するには、it.next() を使用する必要があります。
  2. すでに述べたように、文字列を比較するには equals が必要です。== は「メモリ位置」を比較します (C++ 用語で)。
于 2013-07-08T14:10:44.980 に答える
0

比較する前に、反復の次の要素を取得する必要があります。

java.util.Collection<InstallationComponentSetup> components= context.getInstallationComponents();
Iterator<InstallationComponentSetup> it = components.iterator();
while (it.hasNext()) {
    if ("ACQ".equals(it.next().getName())) {
         return true;   
    }
}
于 2013-07-08T14:08:48.007 に答える
0

install4j API はまだ Java 1.4 用であるため、ジェネリックはまだありません。これはうまくいきます:

    for (Object o : context.getInstallationComponents()) {
        InstallationComponentSetup component = (InstallationComponentSetup)o;
        if (component.getName().equals("ACQ")) {
            return true;
        }
    }
于 2013-07-10T07:49:07.517 に答える
0

it.next() を使用して次の要素を取得します。

また、.equals() メソッドを使用して、Java で文字列を比較します。それ以外の場合は、参照が比較されます。

最後に、型パラメーター化された Iterator ではキャストは不要です。

while (it.hasNext())
{
    if ( it.next().getName().equals("ACQ") ) {
       ...
    }
}
于 2013-07-08T14:08:03.567 に答える
0

foreachループを使用し、ジェネリック型を使用し、文字列に equals を使用し、文字列の比較順序を変更してnull安全にする方が簡単です。

Collection<InstallationComponentSetup> components= context.getInstallationComponents();
for (InstallationComponentSetup setup : components)
{
    if ("ACQ".equals(setup.getName()))
    {
        return true;   
    }
}
于 2013-07-08T14:09:58.337 に答える