2017-11-02 3 views
0

既存のプログラムでnoDups()というメソッドを作成して、順番を乱すことなく、以前にソートされた配列から。質問には、O(N)のアルゴリズムでなければならないと述べられており、重複がいくつあっても、何度も移動された項目がないことを確認します。ロング[]をセットに変更する。エラーメッセージ:型コレクション内のaddAllメソッドは引数には適用されません。(<Long>、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)); 

私は、Set間違っを初期化するだろうか?誰かがエラーを取り除くか、長い[]をセットに変換する正しい方向に私を導く方法を教えてもらえますか?ありがとうございました!

答えて

1

をお使いの配列がソートされている場合、あなたはいけませんネストされたforループが必要です。配列を1回歩き回ることができ、前のものと異なる場合にのみ項目を追加することができます。

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[]ではありません。

前後に変換するには、いくつかのループを実行する必要があります。配列をループして、要素を1つずつSetに追加してから、プリミティブ配列を作成し、その要素をループして要素を配置する必要があります。

(またはあなたが今long[]を使用しているどこでもあなただけLong[]を使用することができますが、それは非効率的になるだろうと私はあなたの場所でそれを避けると思います。)

0

あなたのアプローチにはいくつかの問題があります。他の人のよう

  1. が説明した、あなたはSet<long>のみSet<Long>はJavaでオートボクシングを参照してください、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(); 
関連する問題