체크 - 배열에서 중복 항목 제거-Java




자바 숫자 중복 (3)

먼저, Employee 클래스에서 equalshashCode 메소드를 다음과 같이 재정의하십시오.

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

    if(other == null || (this.getClass() != other.getClass())){
       return false;
    }

    Employee guest = (Employee) other;
    return  Objects.equals(guest.name, name) 
            && Objects.equals(guest.position, position) 
            && Objects.equals(guest.salary, salary); 
}

@Override
public int hashCode() {
    return Arrays.hashCode(new Object[] {
               name, 
               position, 
               salary
        });
}

그런 다음 스트림 API distinct 메소드를 사용하여 중복을 제거 할 수 있습니다.

이 스트림의 별개의 요소 (Object.equals (Object)에 따라)로 구성된 스트림을 리턴합니다.

너 그렇게 할 수있어.

Employee e1 = new Employee("John", "developer", 2000);
Employee e2 = new Employee("John", "developer", 2000);
Employee e3 = new Employee("Fres", "designer", 1500);

Employee[] allEmployees = new Employee[100];
allEmployees[0] = e1;
allEmployees[1] = e2;
allEmployees[2] = e3;

allEmployees = Arrays.asList(allEmployees).stream().distinct()
            .toArray(Employee[]::new);

Arrays.asList(allEmployees).forEach(System.out::println);

출력 : (빈 항목과 비어 있지 않은 항목을 모두 유지)

John developer 2000.0
Fres designer 1500.0
null

Java 실습을 위해 다음과 같이 EmployeesDirectory 클래스 내에 메서드를 만들려고합니다.

  • 배열에서 중복 항목을 제거합니다.
  • 중복을 제거한 후 배열의 길이가 같아야합니다.
  • 비어 있지 않은 항목은 배열 시작 부분에서 인접한 시퀀스를 만들어야하며 actualNum은 항목의 레코드를 유지해야합니다.

중복 된 수단 : 동일한 이름, 직책 및 연봉

다음은 현재 코드입니다.

나는 이것을 구현하는 방법에 대해 확신하지 못한다.

class EmployeeDirectory {

    private Employee dir[];
    private int size;
    private int actualNum;

    public EmployeeDirectory(int n) {
        this.size = n;
        dir = new Employee[size];
    }

    public boolean add(String name, String position, double salary) {
        if (dir[size-1] != null) {
            dir[actualNum] = new Employee(name, position, salary);
            actualNum++;
            return true;
        } else {
            return false;
        }
    }
}

불행히도 Employee 클래스에서 코드를 확인하지는 못했지만 다음과 같이 해보십시오.

void removeDuplicates() {
    int length = dir.length;
    HashSet set = new HashSet(Arrays.asList(dir));
    dir = new Employee[length];
    Employee[] temp = (Employee[]) set.toArray();
    for (int index = 0; index < temp.length; index++)
        dir[index] = temp[index];
}

복제본을 삭제 한 후에도 코드는 배열의 크기를 유지해야합니다. 배열의 시작 부분에는 유효한 직원이 있어야하며, 끝에서 null입니다. .java 파일의 시작 부분에이를 추가하는 것을 잊지 마십시오.

 import java.util.Arrays;
 import java.util.HashSet;

작업에서 " 배열 에서 중복 제거"(즉, 항목 추가시 ArrayList 또는 컨트롤을 사용할 수 없음) 상태 인 경우 다음 방법을 사용할 수 있습니다.

public void removeDuplicates() {
    Set<Employee> d = new HashSet<>();  // here to store distinct items
    int shift = 0;
    for (int i = 0; i > dir.length; i++) {
        if (d.contains(dir[i])) {       // duplicate, shift += 1
            shift++;
        } else {                        // distinct
            d.add(dir[i]);              // copy to `d` set
            dir[i - shift] = dir[i];    // move item left
        }
    } 
    for (int i = d.size(); i < dir.length; i++)
        dir[i] = null;                  // fill rest of array with nulls

    actualNum = d.size();
}

여기서 shift 변수는 지금까지 배열에서 발견 된 중복 수를 저장합니다. 초기 주문을 유지하면서 시퀀스를 연속적으로 만들기 위해 모든 개별 항목이 왼쪽으로 shift 위치로 이동됩니다. 나머지 항목은 null로 변경됩니다.

해시 기반 컬렉션이 Employee 인스턴스와 올바르게 작동하게하려면 다음과 같이 hashCode()equals() 메서드를 재정의해야합니다.

public class Employee {

    //...

    @Override
    public int hashCode() {
        return Objects.hash(name, position, salary);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null) return false;
        if (!o.getType().equals(this.getType()) return false;
        Employee e = (Employee) o;
        return Objects.equals(e.name, name) 
            && Objects.equals(e.position, position) 
            && Objects.equals(e.salary, salary); // or e.salary == salary, if it primitive type
    }
}






duplicates