2

ちょっとした問題が発生しましたが、このコードが機能しない理由がよくわかりません。

私は2次元配列リストを持っています:

List<List<String>> matrix = new ArrayList<List<String>>();

ユーザー入力に基づいて配列リストをマトリックスに追加するボタンがあります。しかし、ユーザー入力を追加する前に、その文字列が既に存在するかどうかを検索するためのボタンが必要です。私が持っているコードではエラーは発生しませんが、最初の要素を除いて、既存の文字列と存在しない文字列を区別することはできません。存在に関係なく、ユーザーが入力したすべてを追加します。また、コードは行列配列にすでにいくつかの要素が含まれている場合にのみ機能し、行列が空の場合、コードはまったく機能しません。私は何を間違っていますか?

   String name = NameTXT.getText(); 
   String amount = CountTXT.getText();

   for (int i = 0; i < matrix.size(); i ++){
     String search = matrix.get(i).get(0);
     if (name.equals(search)){
         OutputTXT.setText("Item already exists");
         break;
     } else {
         List<String> col = new ArrayList<String>();
         col.add(name);
         col.add(amount);
         matrix.add(col);
         OutputTXT.setText(amount +" "+ name +" added");
         break;
     }
   }
4

4 に答える 4

2

壊す; for ループを完全に停止することを意味します。マトリックスの次の項目に移動するだけの場合は、continue を使用できます。

于 2012-12-12T08:07:55.020 に答える
0

アイテムの検索とアイテムの挿入の分離:

String name = NameTXT.getText(); 
String amount = CountTXT.getText();

// searching for product
boolean isNewItem = true;

for (int i = 0; i < matrix.size(); i++){
    String search = matrix.get(i).get(0);

    if (name.equals(search)){
        OutputTXT.setText("Item already exists");
        isNewItem = false;
        break;
    } 
}

// insert if new item 
if ( isNewItem ) {
    List<String> col = new ArrayList<String>();
    col.add(name);
    col.add(amount);
    matrix.add(col);
    OutputTXT.setText(amount +" "+ name +" added");
}

実際には、抽象的な方法で設計し、言語ツールを使用して問題を解決する方が良いでしょう。たとえば、アイテムのリストが次の場合、リストはより簡単に機能します。

class Item {
    private String name;
    private String amount;

    public Item(String name, String amount) {
        this.name = name;
        this.amount = amount;
    }

    public String getName() { 
        return this.name;
    }

    public String getAmount() {
        return this.amount;
    }

    @Override
    public boolean equals(Object other) {
        if ( other == this )
            return true;

        if ( other == null )
            return false;

        if ( other.getClass() != this.getClass() )
            return false;

        Item otherItem = (Item) other;
        return otherItem.getName().equals(this.name);
    }
}

リストは次のようになります。

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

検索する必要がある場合:

Item item = new Item(NameTXT.getText(), CountTXT.getText());

if ( !items.contains(item) ) {
   items.add(item);
} 
于 2012-12-12T09:13:37.243 に答える
0

リスト内のすべての項目をループして、contains を使用するだけではない理由:

for(List<String> list : matrix){
 if(!list.contains(name){
   //add element to matrix
 }
}
于 2012-12-12T08:34:40.133 に答える
0

うーん...もし私があなただったら、古典的なforの代わりにforeach構文を試してみます。マトリックスが空のときにコードが機能しないのはそのためだと思います。空の arraylist ではこれを行うことはできません。

matrix.get(i).get(0);

また、else 句は if 句内に埋め込まれているため、コードがどのようにコンパイルされるかわかりません。

次のようなものを試してください:

for(List<String> elem : matrix){
     if(elem.get(0).equals(name)){
     // do stuff
     }
     else{ //do other stuff }
}
于 2012-12-12T08:11:20.273 に答える