2016-10-06 2 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

첫 번째 작업을 기대하지 않습니다. 나는 두 번째가 작동 할 것으로 기대한다. 두 번째 코드를 보여주십시오. –

+0

@LouisWasserman 두번째 것은 이것입니다 'public void eliminarPos (String var, String lex, String valor, 정수 ii) { boolean uno = data.remove (ii); System.out.println (uno); }' 출력이 '거짓' – Baker1562

답변

1

remove은 문자열 배열에 의해 동작하지 않습니다. 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}); 

이 작동하지 않습니다, 및 배열에리스트에서 찾을 수 없습니다. 당신이 int의 대신에게 Integer을 통과하기 때문에


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

이 작동하지 않습니다. Integer은 개체이므로 목록에서 해당 개체를 검색하고 있습니다. 로 변경 : 당신이 Javadocs을 살펴 경우

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

, 당신은 remove을위한 2 개 개의 다른 오버로드 방법이 있다는 것을 확인할 수 있습니다. 하나의 위치로서, 다른 원시 정수 Object를 취

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을 리턴합니다.

이제는 후자가 실패하는 이유는 새 String 배열을 작성하여 새 인스턴스를 작성하기 때문입니다. new String[] { var, lex, valor }new String[] { var, lex, valor }, 즉과 같지 않으므로 Java는 ArrayList에서 동일한 Object를 찾지 못하고 항목을 제거하지 않습니다. 이 솔루션은 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); 
} 

자바는 다음 원시적 정수를 통과하기 때문에 원시적 정수에 걸리는 방법을 사용합니다. incompatible types: String[] cannot be converted to boolean이 표시되는 이유는 remove(int index)에 지정된 실제 위치의 개체 또는 boolean이 아닌 remove(Object o)이 아닌 제거 된 개체를 반환하기 때문입니다.