질문: 예를 들어 배열(요소 개수는 0개)이 있는데 추가된 요소가 반복되지 않기를 바랍니다.
그런 질문을 받으면 빠르게 코드를 적을 수도 있겠네요. 여기 배열은 ArrayList를 사용합니다.
private static void testListSet(){ List<String> arrays = new ArrayList<String>(){ @Override public boolean add(String e) { for(String str:this){ if(str.equals(e)){ System.out.println("add failed !!! duplicate element"); return false; }else{ System.out.println("add successed !!!"); } } return super.add(e); } }; arrays.add("a");arrays.add("b");arrays.add("c");arrays.add("b"); for(String e:arrays) System.out.print(e); }
여기서는 아무것도 신경 쓰지 않고 배열에 요소를 추가할 때 판단만 합니다(물론). , 배열 요소 추가는 add 메소드만 사용), 동일한 요소가 이미 존재하는지 여부, 해당 요소가 배열에 존재하지 않으면 배열에 추가되며 그 반대의 경우도 마찬가지입니다. 이렇게 작성하는 것은 간단할 수 있지만 거대한 배열에 직면하면 어색해 보입니다. 100,000개의 요소가 있는 배열에 하나의 요소가 있는 경우 동일한 100,000번을 호출해야 합니까? 기본 사항은 다음과 같습니다.
질문: 이미 일부 요소가 있는 배열을 추가한 후 배열에서 중복된 요소를 삭제하는 방법은 무엇입니까?
Java의 컬렉션은 일반적으로 목록과 집합이라는 두 가지 범주로 나눌 수 있다는 것을 누구나 알고 있습니다. List 클래스 컬렉션의 요소는 순서가 지정되어야 하지만 반복될 수 있는 반면, Set 클래스 컬렉션의 요소는 순서가 지정되지 않아야 하지만 반복될 수 없습니다. 그런 다음 여기서 중복 요소를 삭제하기 위해 설정 기능을 사용하면 목표를 달성할 수 있는지 여부를 고려할 수 있습니다. 결국 시스템의 기존 알고리즘을 사용하는 것이 지금 작성하는 알고리즘보다 낫습니다.
public static void removeDuplicate(List<People> list){ HashSet<People> set = new HashSet<People>(list); list.clear(); list.addAll(set); } ivate static People[] ObjData = new People[]{ new People(0, "a"),new People(1, "b"),new People(0, "a"),new People(2, "a"),new People(3, "c"), };
public class People{ private int id; private String name; public People(int id,String name){ this.id = id; this.name = name; } @Override public String toString() { return ("id = "+id+" , name "+name); } }
위의 코드는 사용자 정의 People 클래스를 사용합니다. 동일한 객체(동일한 데이터 내용 참조)를 추가하면 RemoveDuplicate 메소드를 호출하여 동일한 객체가 여전히 존재한다는 것을 알았습니다. 그렇다면 HashSet에서 객체가 동일한지 어떻게 확인합니까? HashSet 소스 코드를 열면 데이터를 추가할 때마다 add 메소드를 호출해야 한다는 것을 알 수 있습니다.
@Override public boolean add(E object) { return backingMap.put(object, this) == null; }
여기서 backingMap은 HashSet이 유지 관리하는 데이터입니다. 매번 개체를 추가하기 위해 매우 영리한 메소드를 사용합니다. . HashMap의 KEY로서 HashSet 객체 자체가 VALUE로 처리됩니다. 이는 Hashmap의 KEY 속성을 활용하므로 당연히 HashSet의 데이터가 반복되지 않습니다. 하지만 실제 중복 데이터가 있는지 여부는 HashMap에서 두 KEY가 동일한지 여부를 어떻게 확인하느냐에 따라 달라집니다.
@Override public V put(K key, V value) { 390 if (key == null) { 391 return putValueForNullKey(value); 392 } 393 394 int hash = secondaryHash(key.hashCode()); 395 HashMapEntry<K, V>[] tab = table; 396 int index = hash & (tab.length - 1); 397 for (HashMapEntry<K, V> e = tab[index]; e != null; e = e.next) { 398 if (e.hash == hash && key.equals(e.key)) { 399 preModify(e); 400 V oldValue = e.value; 401 e.value = value; 402 return oldValue; 403 } 404 } 405 406 // No entry for (non-null) key is present; create one 407 modCount++; 408 if (size++ > threshold) { 409 tab = doubleCapacity(); 410 index = hash & (tab.length - 1); 411 } 412 addNewEntry(key, value, hash, index); 413 return null; 414 }
일반적으로 여기서의 아이디어는 해시맵의 요소를 순회하는 것입니다. 요소의 해시코드가 동일한 경우(사실 해시코드는 한 번 처리해야 함) KEY의 eqaul 방법을 판단합니다. 이 두 가지 조건이 충족되면 서로 다른 요소입니다. 그런 다음 배열의 요소 유형이 사용자 정의되고 Set 메커니즘을 사용하려면 Equal 및 hashmap을 직접 구현해야 합니다(hashmap 알고리즘은 여기에서 자세히 소개되지 않으므로 이해할 수만 있습니다). 방법:
public class People{ private int id; // private String name; public People(int id,String name){ this.id = id; this.name = name; } @Override public String toString() { return ("id = "+id+" , name "+name); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object obj) { if(!(obj instanceof People)) return false; People o = (People)obj; if(id == o.getId()&&name.equals(o.getName())) return true; else return false; } @Override public int hashCode() { // TODO Auto-generated method stub return id; //return super.hashCode(); } }
위 내용은 Java 배열에서 중복 요소를 제거하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!