2016-10-06 3 views
1

期待どおりに動作しません:は私が好きに追加された文字列配列のArrayListのを持っている

List<String[]> data = new ArrayList<>(); 
data.add(new String[] {var, lex, valor}); 

出力は、いくつかのためにfalseある文字列配列のいずれかを消去しようとしています理由。ここで私はそれを削除する方法は次のとおりです。

data.remove(new String[] {var, lex, valor}); 

私はまた、位置を使用して削除しようとした次のように、方法は次のとおりです。

public void eliminarPos(String var, String lex, String valor, Integer ii) { 
    boolean uno = data.remove(ii); 
    System.out.println(uno); 
} 

上記の方法の出力はfalseです。 ArrayListからString配列を正常に削除する方法はありますか?

+0

位置によって削除すると効果があります。正しいインデックスを使用していますか?戻り値は削除された配列になります – sidgate

+2

私は最初のものが動作するとは思わないでしょう。私は二番目がうまくいくと思います。 2番目のコードを表示してください。 –

+0

@LouisWasserman 2番目はこれです 'public void eliminatearPos(String var、String lex、String valor、整数ii){ boolean uno = data.remove(ii); System.out.println(uno); } ' 出力は' false'です – Baker1562

答えて

1

文字列配列では、list.removeがオブジェクトのequals()を呼び出すため動作しません。 array.equalsの場合、それは単に参照の比較(==)です。

位置による削除は機能し、正しいインデックスはプリミティブintとして指定する必要があります。

public void eliminarPos(String var, String lex, String valor, int ii) { 
    String[] uno=data.remove(ii); 
    System.out.println(uno); 
} 
3
data.remove(new String[]{var, lex, valor}); 

配列が同じものが含まれている場合でも、彼らはお互いに等しくないので、動作しないだろう、とのアレイは、リストに記載されていません。


public void eliminarPos(String var, String lex, String valor, Integer ii) { 
    boolean uno=data.remove(ii); 
    System.out.println(uno); 
} 

あなたはそれを代わりにintIntegerを渡すために動作しません。 Integerはオブジェクトであるため、そのオブジェクトのリストを検索しています。それを変更します。あなたはJavadocsを見てみる場合は

public void eliminarPos(String var, String lex, String valor, int ii) { 
    data.remove(ii); 
} 
6

、あなたはremoveのための2つの異なるオーバーロードされた方法があることがわかります。一つのオブジェクトをとり、位置などの他のプリミティブ整数:

remove

public E remove(int index)

は、このリスト内の指定された位置にある要素を削除します。後続の要素を左にシフトします(インデックスから1を引きます)。

remove

public boolean remove(Object o)

があれば、このリストの指定された要素の最初の発生を削除:

上記プリミティブ整数を受け取り、以下のオブジェクトを取り存在する。リストに要素が含まれていない場合は、変更されません。

なぜfalseが表示されるのは、プリミティブintのラッパークラスを指定したためです。 Integerオブジェクトです。したがって、Javaは、あなたが呼び出す方法に最もよく似たメソッドを使用します。この場合、Objectパラメータを使用して呼び出します。 Javaはメソッドシグネチャremove(Object o)を使用し、指定されたIntegerはArrayListに存在しないため、falseを返します。

ここで失敗する理由は、新しいインスタンスを作成して新しいインスタンスを作成するためです。 new String[] { var, lex, valor }new String[] { var, lex, valor }ではありません。つまり、と等しいため、JavaはArrayList内で同じオブジェクトを見つけず、アイテムを削除しません。解決策は、プリミティブintを使用することです:

public void eliminarPos(String var, String lex, String valor, int ii) { 
    String[] uno = data.remove(ii); //Make sure to use String[], as different types are returned 
    System.out.println(uno); 
} 

Javaは、あなたがプリミティブ整数を渡すためのプリミティブ整数に取るメソッドを使用します。 incompatible types: String[] cannot be converted to booleanが表示されるのは、remove(int index)の指定された位置にある実際のオブジェクトまたは削除されたオブジェクトで、booleanのようにremove(Object o)のように表示されないためです。

関連する問題