2016-06-13 83 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);