2016-06-13 56 views
-2

我有一個雙陣列:從Java中的double數組中刪除重複的值?

double []signs = new double [sizelines]; 

我需要刪除所有重複的值或者幹​​脆不重複提取值。

我試圖使用SetHashSet,但我不能讓它與雙倍的工作。我用下面的代碼:

Double[] Duplicates(double[] signs) { 

     Set<double[]> myset = new HashSet<double[]>(Arrays.asList(signs)); 
     Double[] signsfinal = myset.toArray(new Double[myset.size()]); 

     return signsfinal; 
    } 

和我收到以下錯誤:

源[0]類型的雙[]不能被存儲在類型的目標陣列java.lang.Double中[]

+0

正是你嘗試過什麼?你能提供一些代碼嗎? – Leon

+0

你需要更精確。 「刪除」是什麼意思?後期的輸入例子,預期的輸出和你到目前爲止嘗試過的代碼。 – Pshemo

+0

「我無法讓它工作」是沒有足夠的信息讓任何人知道你的代碼有什麼問題。你需要[編輯]你的問題,以包含代碼和你得到的任何編譯/運行時錯誤。 – azurefrog

回答

0

首先你需要從你的數組中創建一個Set。您只需要定義myArray類型Double[]以避免在註釋中出現Pshemo提到的錯誤。

Double[] myArray = ... // Of type Double[] 
Set<Double> myset = new HashSet<Double>(Arrays.asList(myArray)); 

比將其轉換回的陣列

double[] noDuplicates = myset.toArray(new double[myset.size()]); 

第一步刪除重複。第二步將其轉換回數組。


如果myArray的是雙(基本型)的數組,你需要一個額外的步驟將其轉換爲等效的包裝:

double[] myArrayOdPrimitives = ... 
Double[] myArray = ArrayUtils.toObject(myArrayOdPrimitives); 
Set<Double> myset = new HashSet<Double>(Arrays.asList(myArray)); 
double[] noDuplicates = myset.toArray(new double[myset.size()]); 
+1

'新的HashSet '對於'Set '也不是正確的類型。同樣'myset.toArray'類似於'asList'。它也期望'T'類型和'T'的數組不能代表原始類型,所以'double [] noDuplicates = myset.toArray(new double [myset.size()]);'不能編譯。發佈前請測試答案(這不是比賽)。 – Pshemo

+0

@Pshemo右...我用String開始。我發佈了它。然後我看到問卷要求Double,我沒有重新測試就更改了它。 –

1

設置和HashSet的類不具有原始類型的工作像doubleint,你必須做這樣的事情:Set<Double> mySet = new HashSet<Double>();然後添加這樣的內容:mySet.add(new Double(12.5));

0

如果您構建與陣列一套集將excluse複製的我爲TEMS你

例子:

public static void main(String[] args) { 
    Double[] foo = { 1.1, 1.1, 1.1, 1.1, 1.1, 1.1, 2.1, 3.1, 4.1 }; 
    Set<Double> fSet = new HashSet<>(Arrays.asList(foo)); 
    System.out.println(fSet); 
    } 

這將打印

[3.1, 4.1, 1.1, 2.1]

至極爲您

0

所需的輸出試試這個: 不要忘記使用Double而不是doubleint這是原始類型

Double []signs = {83.4d,34.03d,4.301d,4.01d,34.03d,6.7d,4.01d,85d,83.4d}; 
     Set<Double> newSings = Stream.of(signs) 
           .collect(Collectors.toCollection(HashSet::new)); 

     System.out.println(newSings); 

的方法:

Double[] Duplicates(double[] signs) { 

    Set<Double> signsfinal = Stream.of(signs) 
           .collect(Collectors.toCollection(HashSet::new));; 

    return signsfinal; 
} 

輸出:

[4.01, 85.0, 4.301, 6.7, 83.4, 34.03]

0

當你做Set<double[]> myset = new HashSet<double[]>(Arrays.asList(signs));,實際上創建doubleSet一個數組,你真正想要一套Double。請嘗試:

Double[] duplicates(double[] signs) 
{ 
    Set<Double> myset = new HashSet<Double>(); 
    for (double d : signs) 
    { 
     myset.add(Double.valueOf(d)); 
    } 
    Double[] signsfinal = (Double[]) myset.toArray(); 

    return signsfinal; 
} 

P.S:Java中的約定是以小寫字符開始方法名稱。

+0

我試過了。我仍然得到一個錯誤,但它有點不同...它說:java.lang.Object []不能轉換爲java.lang.Double [] 在org.opencv.samples.tutorial1.LinesProcess.duplicates – user3855955

+0

@ user3855955這很奇怪,我沒有得到這個代碼的任何錯誤。但是如果它不適合你,用'Double [] signfinal = myset.toArray(new Double [0])替換Double [] signfinal =(Double [])myset.toArray();' –

0

在Java 8所有你需要的是

double[] values = {1., 2., 1., 3.}; 
double[] uniques = DoubleStream.of(values).distinct().toArray(); 

類似的Double[]

Double[] values = {1., 2., 1., 3.}; 
Double[] uniques = Stream.of(values).distinct().toArray(Double[]::new);