java - 如何在不使用集合的情况下从Java中的给定数组中删除重复元素

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/31050573/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 17:59:52  来源:igfitidea点击:

How can I remove duplicate elements from a given array in java without using collections

javaarrays

提问by siddhartha

I have an array elements like this:

我有一个这样的数组元素:

int arr[] = {1,1,2,2,3,3,4,4};

I want to remove the duplicate elements from. Searched on the internet and came to know about ArrayUtil class. Could you please help me by telling it's usage - that's how can I get an array like this in output:

我想从中删除重复的元素。上网查了一下,才知道ArrayUtil类。您能否通过告诉我它的用法来帮助我 - 这就是我如何在输出中获得这样的数组:

arr[] = {1,2,3,4};

回答by amit

This is the next step from Element Distinctness Problem, which is discussed thoroughly in this thread: Find duplicates in an array, including lower bounds for the problem (cannot do better than O(nlogn)without a hash set involved).

这是Element Distinctness Problem的下一步,该线程在此线程中进行了彻底讨论:在数组中查找重复项,包括问题的下限(不能比O(nlogn)不涉及哈希集做得更好)。

If you are unwilling to use a hash-set to check out all the elements you have already seen, your best bet is to sort the array, and then iterate it - all duplicate elements will be adjacent to each other.

如果您不愿意使用散列集来检查您已经看到的所有元素,最好的办法是对数组进行排序,然后对其进行迭代——所有重复的元素将彼此相邻。

public static int[] justUniques(int[] arr) { 
    if (arr == null || arr.length == 0) return arr;
    Arrays.sort(arr);
    int n = 1;
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] != arr[i-1]) n++;
    }
    int[] res = new int[n];
    res[0] = arr[0];
    n = 1;
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] != arr[i-1]) res[n++] = arr[i];
    }
    return res;

}

Note that a simple variation of the above can also do it in-place, without creating a new array.

请注意,上述的一个简单变体也可以就地完成,而无需创建新数组。

This solution is O(nlogn), and thus is optimal. You can implement your own sorting algorithm (it's fairly easy) if you are unwilling to use the Arrays.sort()one.

这个解是O(nlogn),因此是最优的。如果您不愿意使用排序算法,您可以实现自己的排序算法(这很容易)Arrays.sort()

Another related thread that asks similar question with an additional restriction: Removing the duplicates from an array without disturbing the order of elements without using Sets

另一个相关线程提出了类似的问题,但有一个额外的限制:Removing the duplicates from an array而不干扰元素的 order without using Sets

回答by siddhartha

Got a very Good Solution for this question : and it works perfectly . For those who are still searching answer for this question , you can use this below piece of code.

为这个问题提供了一个很好的解决方案:它完美无缺。对于仍在寻找此问题答案的人,您可以使用以下代码。

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class DuplicatesRemove {

public static void main(String[] args) throws Exception {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    System.out.print("Enter the array size :");
    int size = Integer.parseInt(br.readLine());

    int[] arr = new int[size];

    // Creating the array
    for (int i = 0; i < size; i++) {
        System.out.print("Enter the element arr[" + i + "] = ");
        arr[i] = Integer.parseInt(br.readLine());
        System.out.println();
    }

    // displaying the array - it may contain elements in unsorted manner
    System.out.println("Before Sorting :");
    for (int i = 0; i < size; i++) {
        System.out.println("Element arr[" + i + "] = " + arr[i]);
    }
    System.out
            .println("*****************************************************");

    // Logic for sorting the elements in the array
    for (int i = 0; i < size; i++) {
        for (int j = 1; j < size - i; j++) {
            if (arr[j - 1] > arr[j]) {
                int temp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = temp;
            }
        }
    }

    // Printing the sorted elements - it may contain duplicate elements
    System.out.println("After Sorting :");
    for (int i = 0; i < size; i++) {
        System.out.println("Element arr[" + i + "] = " + arr[i]);
    }

    System.out
            .println("*****************************************************");
    // Logic for removing the duplicate elements
    int compare = 0;
    arr[compare] = arr[0];

    for (int i = 1; i < size; i++) {
        if (arr[compare] != arr[i]) {
            compare++;
            arr[compare] = arr[i];
        }
    }

    System.out.println("Array After removing duplicate elements is :");
    for (int i = 0; i <= compare; i++) {
        System.out.println("Element arr[" + i + "] = " + arr[i]);
      }
   }
}

回答by Avinash Pande

public class UniqueElementinAnArray 
{

public static void main(String[] args) 
{
    int[] a = {10,10,10,10,10,100};
    int[] output = new int[a.length];
    int count = 0;
    int num = 0;

    //Iterate over an array
    for(int i=0; i<a.length; i++)
    {
        num=a[i];
        boolean flag = check(output,num);
        if(flag==false)
        {
            output[count]=num;
            ++count;
        }

    }

    //print the all the elements from an array except zero's (0)
    for (int i : output) 
    {
        if(i!=0 )
            System.out.print(i+"  ");
    }

}

/***
 * If a next number from an array is already exists in unique array then return true else false
 * @param arr   Unique number array. Initially this array is an empty.
 * @param num   Number to be search in unique array. Whether it is duplicate or unique.
 * @return  true: If a number is already exists in an array else false 
 */
public static boolean check(int[] arr, int num)
{
    boolean flag = false;
    for(int i=0;i<arr.length; i++)
    {
        if(arr[i]==num)
        {
            flag = true;
            break;
        }
    }
    return flag;
}

}

}

回答by Swapnil Navale

Use below method:

使用以下方法:

/*
 * Method to remove duplicates from array in Java, without using
 * Collection classes e.g. Set or ArrayList. Algorithm for this
 * method is simple, it first sort the array and then compare adjacent
 * objects, leaving out duplicates, which is already in the result.
 */
public static int[] removeDuplicates(int[] numbersWithDuplicates) {

    // Sorting array to bring duplicates together      
    Arrays.sort(numbersWithDuplicates);     

    int[] result = new int[numbersWithDuplicates.length];
    int previous = numbersWithDuplicates[0];
    result[0] = previous;

    for (int i = 1; i < numbersWithDuplicates.length; i++) {
        int ch = numbersWithDuplicates[i];

        if (previous != ch) {
            result[i] = ch;
        }
        previous = ch;
    }
    return result;

}

回答by BoDidely

public int[] removeDuplicates(int[] arr) {
    int[] res = new int[arr.length];
    int index = 0;
    for (int num : arr) {
        if (res.indexOf(num) == -1)
            res[index++] = num;
    }
    return res;
}

This is a suboptimal solution, however it does not require any sorting of the array. I create a new array, iterate through the items in the original one and add the items to the new array if they aren't already there.

这是一个次优的解决方案,但它不需要对数组进行任何排序。我创建了一个新数组,遍历原始数组中的项目,如果这些项目尚不存在,则将它们添加到新数组中。

回答by rajesh

public static int[] removeDuplicates(int[] input){

    int j = 0;
    int i = 1;
    //return if the array length is less than 2
    if(input.length < 2){
        return input;
    }
    while(i < input.length){
        if(input[i] == input[j]){
            i++;
        }else{
            input[++j] = input[i++];
        }   
    }
    int[] output = new int[j+1];
    for(int k=0; k<output.length; k++){
        output[k] = input[k];
    }

    return output;
}

Source : http://java2novice.com/java-interview-programs/remove-duplicates-sorted-array/

来源:http: //java2novice.com/java-interview-programs/remove-duplicates-sorted-array/

回答by Naidu

package practice1;

import java.util.Scanner;

public class RemoveArrayDuplicatesElements {


    public static void main(String[] args) {

        int i, j, k, size,same = 0;

        System.out.println("\nEnter array size : ");
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        size = sc.nextInt();
        int[] arr = new int[size+1];
        System.out.println("\nAccept Numbers : ");
        for (i = 0; i < size; i++)
            arr[i] = sc.nextInt();

        System.out.println("\nArray with Unique list  : ");

        for (i = 0; i < size; i++) {
              for (j = i + 1; j < size;) {
                 if (arr[j] == arr[i]) {
                     same++;
                    for (k = j; k < size; k++) {
                       arr[k] = arr[k + 1];
                    }
                    size--;
                 } else
                    j++;
              }
           }




        for (int g = 0; g < arr.length; g++) {
            System.out.println(arr[g]);
        }

    }

}

回答by janisunny

    int flag = 0, k = 0;
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arrAns.length; j++) {
            if (arr[i] == arrAns[j]) {
                flag = 0;
                break;
            }
            flag=1;
        }
        if (flag == 1) {
            arrAns[k] = arr[i];
            k++;
        }
        flag = 0;
    }

回答by Patnaidu Landa

package com.array;
import java.util.*;

class RemoveDuplicatesInArray{

    public static void main(String[] args) {
        Integer[] array = new Integer[10];

        array[0] = 1;
        array[1] = 2;
        array[2] = 3;
        array[3] = 3;
        array[4] = 3;
        array[5] = 3;
        array[6] = 7;
        array[7] = 7;
        array[8] = 9;
        array[9] = 9;
        removeDuplicatesFromArray(array);

    }


    private static void removeDuplicatesFromArray(Integer[] array){
        StringBuffer stringBuffer = new StringBuffer();
         String arrayString =  Arrays.toString(array);
         for(int index =0 ; index <= arrayString.length(); index++){
          try{
              int number = Integer.parseInt(arrayString.charAt(index)+"");
              if(!stringBuffer.toString().contains(number+"")){
              if(stringBuffer.length()!=0)
                  stringBuffer.append(",");
                 stringBuffer.append(number);
              }

          }catch(Exception e){

          }
         }
         String[] stringArray = stringBuffer.toString().split(",");
         array = new Integer[stringArray.length];
         for(int index = 0 ; index < stringArray.length ; index++){
           array[index] = Integer.parseInt(stringArray[index]); 
         }
         System.out.println(Arrays.toString(array));
      }

}