-3

これは非常に簡単な作業ですが、何かを見落としているように感じます。ArrayListに追加しようとしているオブジェクトが複数あり、それぞれに文字列の形式の識別名があります。文字列名を呼び出して、ArrayList内のオブジェクトを検索(対話)できるようにする必要があります。だから私はこれを試しました:

私のアイテムクラスには、次のものがあります。private String itemName;

public Item(String name)
{
    itemName = name;
}

そのため、ユーザーが使用する名前を付けることができます。


次に、オブジェクトと対話するクラスで、ArrayListを作成します。

private ArrayList<Item> items = new ArrayList<Item>();

最初にオブジェクトを実際のオブジェクト名でarrayListに追加しますが、文字列名を使用してオブジェクトと対話できる必要があるため、これを試しました。

public void removeItem(String itemName)
{
    for (int i = 0; i < items.size(); i++)
    {
        if (items.get(i).toString() == itemName)
        {
            items.remove(i);
        }
        break;
    }

}

しかし、それはアイテムを削除していません。これらすべてが混乱している場合は、本質的に、文字列名を付けることができるオブジェクトを作成しようとしています(上記の項目で行ったように)。次に、オブジェクトをArrayListに追加し、最後にSTRING名を呼び出すことにより、ArrayList内のOBJECTSを削除、取得、または何かを行うことができます。ArrayListを反復処理する必要があることはわかっていますが、実際にはオブジェクトを取得できません。

助けてくれてありがとう。

4

5 に答える 5

4

あなたはここで3つの間違いを犯しています:

  • あなたはあなたのためにあなたitems.get(i).toString()を与えないだろうを使用していitemNameますItem。オーバーライドしない場合は、クラスのメソッドItemによって返されるクラスの文字列表現が提供されます。ただし、メソッドをオーバーライドし、そこからを返した場合、これは機能する可能性があります。しかし、それはわかりません。そして、それをオーバーライドしたとしても、フィールドにゲッターセッターを用意し、それを使用してを返すことをお勧めします。ObjecttoStringtoStringitemNameitemNameitemName

  • 演算子を使用して文字列を比較している==ため、正しい結果が得られません。equals常にメソッドを使用して文字列を比較する必要があります。

したがって、次のif statementようになります。

 if (items.get(i).getName().equals(itemName))
  • 3番目の問題は、List繰り返し処理しているを変更しようとしていることです。これはうまくいかず、スローする可能性がありConcurrentModificationExceptionます。反復中Iteratorに要素を削除するために使用する必要があります。List

これらの2つの問題の詳細と、それらを解決する方法については、を参照してください。

equalsさらに、でメソッドをオーバーライドすることを検討してclassから、メソッドを使用してインスタンスを直接比較できますequals


ここで、コードに関するいくつかの論理的な問題を指摘したので、次にいくつかの設計上の問題を指摘します。

要件を考えると、属性を格納するカスタムタイプでHashMapはなく、を使用する必要があるようです。次のようにList作成できます。map

Map<String, Integer> map = new HashMap<String, Integer>();

itemNameこれには、それぞれへのマッピングが含まれ、特定のitemNameのをItem取得するのは簡単です。Itemmap.get(itemName)

于 2013-02-12T16:18:56.813 に答える
3

Mapたとえば、これにはを使用する必要があるようですjava.util.HashMap<String, Item>。インターフェイスは、Map探している操作を正確に提供し、反復可能です。

于 2013-02-12T16:21:14.070 に答える
1

次のように、オブジェクトにゲッターを追加して名前を取得します。

public class Item {
   private final String name; //once given cannot change
   public Item(String name) {
      this.name = name; //yhis.name to distinguish between 2 variabled both called "name"
   }
   public String getName() {
      return name; //this.name not required as no other variable called "name" is in scope
   }
}

次に、次のようなアイテムを見つけることができます。

for (Item item : theList) {
   if (item.getName.equals(requiredName)) {
      //got you!
   }
}

一般的に言って、文字列を。と比較しないでください==。また、繰り返し処理するリストからアイテムを削除する場合は、(古い)反復子構文を使用する必要があります。

Iterator<Item> iter = theList.iterator();
while (iter.hasNext()) {
   Item item = iter.next();
   if (item.getName.equals(requiredName)) {
      //got you!
      iter.remove();
      break; //no need to go over the rest of the list
   }
}

最後に、アイテムを名前で検索するだけの場合、アイテムを見つけるにはリスト全体をトラバースする必要があるため、リストは最適なコレクションではありません。マップ(具体的にはハッシュマップ)を使用すると、このタイプの操作のパフォーマンスが大幅に向上します。名前をキーとして使用できます

于 2013-02-12T16:20:07.163 に答える
0

私の推測では、items.get(i).toString()はあなたが思っていることをしません。items.get(i).nameのようなものを使用したり、Itemオブジェクトで名前のゲッターまたはセッターを作成してitems.get(i).getName()で名前を取得したりしてみませんか。

于 2013-02-12T16:19:43.187 に答える
0

これがあります-removeItemを実装した方法で、 ArrayList.remove(item.itemName)を使用して直接実行することもできます-これは、 すべてが立ち往生して既存のものを再実装する直前ですConcurrentModificationException-ライブラリを見てください!! ArrayListのドキュメントを読んでください!

明確にするために:Javaで(そしてほとんどの場合実際にはJavaでのみ):==参照の比較を意味します。

それで:

String a = "A";
String b = new StringBuilder("A").toString();
if (a == b) // --> false
if (a.equals(b)) // --> true

そのためにorg.apache.commons.lang.StringUtils.equalsを使用することも検討できます。これはnullポインターに関して安全です。

他の人がすでに指摘しているように、-toStringメソッドは正しく実装した場合にのみ正しく機能します(あなたの場合は名前を返します)。オリジナルtoStringでは、IDとともにクラス名を返します。それはおそらくあなたが望むものではありません(単にそれを印刷してみてください)。

于 2013-02-12T16:29:45.990 に答える