Set
을 사용하지 않고, 당신이 List#contains(Object)
방법을 사용하여 List
동일한 두 개체를 추가 피할 수 있습니다 :
여기 내 코드입니다.
예 :
List<String> strings = new ArrayList<String>();
if (!list.contains("mystring"))
System.out.println("added string? "+list.add("mystring"));
if (!list.contains("mystring"))
System.out.println("added string? "+list.add("mystring"));
출력 :
added string? true
added string? false
함정 방법 위
기본적인 자바 프리미티브 작동 등 String
, Double
, Integer
, ... 등 나만의 물건을 가지고 있다면, hashCode
을 덮어 써야합니다. 수업의 방법은 equals
입니다. 그렇지 않으면 List#contains
메서드는 콘텐츠가 아닌 개체의 주소를 기반으로 동등성을 테스트합니다.
잘못된 예 :
public class Fraction {
int x, int y;
public Fraction(int x, int y) { this.x=x;this.y=y;}
}
List<Fraction> fractions = new ArrayList<Fraction>();
Fraction f1 = new Fraction(1,2);
if (!fractions.contains(f1))
System.out.println("added fraction? "+fractions.add(f1));
if (!fractions.contains(f1))
System.out.println("added fraction? "+fractions.add(f1));
출력 :
added fraction? true
added fraction? true
고정
예 :
public class Fraction {
public int x, int y;
public Fraction(int x, int y) { this.x=x;this.y=y;}
@Override
public boolean equals(Object o) {
if (o==null) return false;
if (o==this) return true;
if (!(o instanceof Fraction) return false;
Fraction f = (Fraction) o;
return f.x == x && f.y ==y;
}
}
List<Fraction> fractions = new ArrayList<Fraction>();
Fraction f1 = new Fraction(1,2);
if (!fractions.contains(f1))
System.out.println("added fraction? "+fractions.add(f1));
if (!fractions.contains(f1))
System.out.println("added fraction? "+fractions.add(f1));
출력 :
added fraction? true
added fraction? false
@ Johan Lundström 귀하의 질문은 매우 명확하지 않습니다, 당신은 뭔가 초보자를 시도해 봤지만, pls는 솔루션을 제공 할 수 있도록 제대로 설명했습니다. –
반복하고 비교하거나 목록에 대한 API 문서를보고 '포함'과 같은 것이 있는지 확인하십시오. –