2017-11-02 4 views
0

noDups()라는 기존 프로그램에 숙제를 요청하여 중복을 제거하도록 요청했습니다. 순서를 어지럽히 지 않고 이전에 정렬 된 배열에서 가져옵니다. 문제는 O (N)가있는 알고리즘이어야하며 몇 개의 중복 항목이 있더라도 두 번 이상 이동 된 항목이 없는지 확인해야합니다.긴 []을 세트로 변경. 오류 메시지 : 형식 컬렉션에있는 addAll 메서드는 인수에 적용되지 않습니다. (<Long>, 긴 [])

처음에는 중첩 된 for-loop를 순환하여 중복을 제거했지만 O (N^2)라고 알았습니다. 세트로이 문제를 풀 수 있다는 것을 알았습니다. 나는 오류가 언급 한 점점 계속

public long[] noDups(long[] target) { //Method for removing duplicates 

     Set<Long> set = new HashSet<Long>(); 
     Collections.addAll(set, target); 

     return target; 
} 

: 나는 세트는 고유 한 값을 포함하고 있기 때문에, 긴 [] (상기 프로그램이 사용하는 배열의 타입) 배열에 걸릴 세트로 변환하는 방법을 쓰기 시도 제목 :

내 방법 전에

"The method addAll(Collection, T...) in the type Collections is not applicable for the arguments (Set, long[])"

이처럼 보였다하지만 난 다른 오류가 있었다 :

public void noDups(long[] target){ 

    Set<long> set = new Hashset<long>(Arrays.asList(target)); 

것은 내가 잘못 설정을 초기화 오전? 누구든지 오류를 없애거나 긴 []을 세트로 변환하는 올바른 방향으로 이끌어내는 방법을 알려줄 수 있습니까? 고맙습니다!

답변

1

를 배열이 정렬되어 있으면 안 중첩 된 for 루프가 필요합니다. 배열을 한번 둘러 볼 수 있어야하고, 이전과 다른 경우에만 항목을 추가 할 수 있어야합니다.

List<Long> newList = new ArrayList<Long>(); 
for(Long l : target) {  
    if(newList.isEmpty() || !l.equals(newList.get(newList.size()-1))) { 
     newList.add(l); 
    } 
} 

newList는 중복되지 않은 모든 항목을 포함해야합니다.

필자는 이것을 테스트하기 위해 편리한 컴파일러를 가지고 있지 않지만 희망적으로는 의미가 있습니다.

0

당신이 시도하는 방식대로 프리미티브와 래퍼를 혼합 할 수 없습니다. 특히 Collections.addAllLong[]만을 허용하고 long[]은 허용하지 않습니다.

앞뒤로 변환하려면 일부 루프를 수행해야합니다. 배열을 반복하고 Set에 요소를 하나씩 추가 한 다음 기본 배열을 만들고 집합을 반복하여 요소를 배치해야합니다.

(또는 당신이 지금 long[]을 사용하고있는 모든 곳에서 그냥 Long[]를 사용할 수 있지만 비효율적 인 것 내가 당신의 장소에 그것을 피할 것.)

0

당신의 접근 방식에 몇 가지 문제가 있습니다 : 다른 사람이 설명했듯이

  1. , 당신이 할 수없는 Set<long>Set<Long> (long는, 자바 자동 복싱를 참조 박스), 당신은 할 수 없습니다 addAll 방법을 사용하여 Long[]의 모든 요소를 ​​Set<Long>에 추가합니다.

  2. 숫자의 순서를 유지해야하므로 한 번에 모든 값을 추가하면 도움이되지 않습니다. 그것은 중복을 걸러 낼 것이지만 주문을 잃을 것입니다.

  3. 입력 배열이 이미 정렬되었으므로 중복을 제거하기 위해 실제로 추가 데이터 구조가 필요하지 않습니다.

    : 여기

배열의 시작에서 고유 한 값을 마련하고 더 이상 필요 배열의 끝 부분을 잘라 배열의 효율적인 복사본을 만들 수있는 O(n) 기술이다
long[] noDups(long[] nums) { 
    if (nums.length == 0) return nums; 

    int pos = 1; 
    for (int j = 1; j < nums.length; j++) { 
     if (nums[j - 1] != nums[j]) { 
      nums[pos++] = nums[j]; 
     } 
    } 

    return Arrays.copyOf(nums, pos); 
} 
0

중복 양식 배열을 제거하려면 HashMap을 사용할 필요가 없습니다. Java 8 스트림 API 만 사용할 수 있습니다. 즉

long[] dups = new long[]{1,2,3,4,4,4}; 
long[] noDups = Arrays.stream(dups).distinct().toArray(); 
관련 문제