2016-03-06 235 views
0

我需要一些帮助,伙计们。 这是分配:创建一个程序,以从随机数组中删除所有重复项。例如,如果阵列具有的值 4,7,10,4,9,5,10,7,3,5 则数组应改为 4,7,10,9,5,3从阵列中删除重复项

程序应该由两个类DeleteDuplicate和DeleteDuplicateDemo组成。

DeleteDuplicate类应执行以下操作 1.有一个方法来检查重复值。阵列 3. currentsize的 2.跟踪有删除重复的方法(与数组中的下一个值代替重复的值。)

的DeleteDuplicateDemo类应做到以下几点 1.让你的主要方法。 2.创建一个长度为10到10的数字的随机数组。 3.显示原始随机数组。 4.调用DeleteDuplicate方法来查找和删除重复项。 5.显示没有重复的新阵列。

样本输出: [8,5,7,3,2,5,6,3,6,7]

[8,5,7,3,2,6]

下面是DeleteDuplicateDemo代码:

import java.util.*; 

public class DeleteDuplicateDemo 
{ 
    public static void main(String[] args) 
    { 

     Random random = new Random(); 
     int array[]= new int[10]; 
     for (int i = 0; i < array.length; i++) 
     { 
      array[i] = random.nextInt(10)+ 1; 
     } 
     for (int i = 0; i < array.length; i++) 
     {   
      System.out.print(array[i] + " "); 
     } 
    System.out.println(); 
    DeleteDuplicate class1 = new DeleteDuplicate(); 
    array = class1.removeDuplicates(array); 

for (int i = 0; i < array.length; i++) 
     {   
      System.out.print(array[i] + " "); 
     } 

    } 
} 

这里是DeleteDuplicate代码:

import java.util.Arrays; 

public class DeleteDuplicate 
{ 
    private static int[] remove(int[] array) 
    { 
     int current = array[0]; 
     boolean found = false; 

     for (int i = 0; i < array.length; i++) 
     { 
     if (current == array[i] && !found) 
     { 
      found = true; 
     } 
     else if (current != array[i]) 
     { 
      System.out.print(" " + current); 
      current = array[i]; 
      found = false; 
     } 
    } 
     System.out.print(" " + current); 
     return array; 
    } 

    public static int[] removeDuplicates(int[] array) { 
     // Sorting array to bring duplicates together  
     Arrays.sort(array); 

     int[] finalArray = new int[array.length]; 
     int previous = array[0]; 
     finalArray[0] = previous; 

     for (int i = 1; i < array.length; i++){ 
     int value = array[i]; 

     if (previous != value){ 
      finalArray[i] = value; 
     } 
     previous = value; 
     } 
     return finalArray; 

     } 
} 

我怎样才能使它发挥作用?我只有在打电话给另一个班时遇到问题。谢谢!

+0

'我只有与调用另一个class.'一个问题,是什么问题?我看到的明显问题是'removeDuplicates'是静态的,所以你不需要'DeleteDuplicate'实例来调用它。另外,如果你发现一个重复的'i'仍然增加,所以你的'finalArray'中有“漏洞” - 是否有意? – John3136

+0

remove()应该做什么?我看到你使用布尔查找找到重复,但你实际上并没有将它用于循环之外的任何其他地方。 –

+0

remove()应该检查重复项并跟踪当前大小。问题是我不确定如何从另一个类DeleteDuplicate调用方法。下面的评论员对此有所帮助,但现在代码删除了最小值,并将0代入删除的值。 –

回答

0

在你DeleteDuplicateDemo类,改变

DeleteDuplicate class1 = new DeleteDuplicate(); 
array = class1.removeDuplicates(array); 

array = DeleteDuplicate.removeDuplicates(array); 

在你DeleteDuplicate类,改变

for (int i = 1; i < array.length; i++){ 
    int value = array[i]; 
    if (previous != value){ 
     finalArray[i] = value; 
    } 
    previous = value; 
} 

for (int i = 1, j = 0; i < array.length; i++){ 
    int value = array[i]; 
    if (previous != value){ 
     finalArray[j] = value; 
     j++; 
    } 
    previous = value; 
} 

然后,当您第二次向控制台打印出array的值时,请务必在打印前检查array[i] != nullarray[i]

0

删除代码过于复杂:如果您写入的数据与写入的数据不同,则不必通过从索引1开始的数组遍历数组,而是单独创建一个删除项目的方法在索引i-1项目:

int rdIndex = 1; 
int wrIndex = 1; 
while (rdIndex != array.length) { 
    if (array[wrIndex-1] != array[rdIndex]) { 
     array[wrIndex++] = array[rdIndex]; 
    } 
    rdIndex++; 
} 
return Arrays.copyOf(array, wrIndex); 

在循环wrIndex的端部指示要被复制到结果数组的项数。

Demo.

+0

非常感谢。我希望我可以使用wrIndex,但我需要以一种复杂的方式来完成。所以数组打印出来,然而,它删除了数组中最小的值,并将0代入删除的数字中。 –

0

试试这个。

public static int[] removeDuplicates(int[] array) { 
    return IntStream.of(array).distinct().toArray(); 
} 

测试:

int[] array = {8, 5, 7, 3, 2, 5, 6, 3, 6, 7}; 
System.out.println(Arrays.toString(removeDuplicates(array))); 
// -> [8, 5, 7, 3, 2, 6]