web-dev-qa-db-ja.com

Java配列から重複を削除しますか?

多くの異なる電子メールアドレスを含むファイルを読み込み、配列を使用してそれらを印刷することになっています。問題は、重複する電子メールを排除する必要があることです。

Try/catchを機能させ、メールアドレスを印刷することができました。ただし、重複を削除する方法がわかりません。ハッシュコードやSetの使い方についてはまだ理解していません。どんな援助もいただければ幸いです。

これが私がこれまでに持っているものです:

import Java.util.Scanner;
import Java.io.*;

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

      Scanner keyboard = new Scanner(System.in);
      System.out.println("Enter file name: ");
      String fileName = keyboard.nextLine();
      if (fileName.equals("")) {
         System.out.println("Error: User did not specify a file name.");
      } else {
         Scanner inputStream = null;

         try {
            inputStream = new Scanner(new File(fileName));
         } catch (FileNotFoundException e) {
            System.out.println("Error: " + fileName + " does not exist.");
            System.exit(0);
         }

         String[] address = new String[100];

         int i = 0;
         while (inputStream.hasNextLine()) {
            String email = inputStream.nextLine();
            // System.out.println(email);

            address[i] = email;
            System.out.println(address[i]);
            i++;
         }
      }
   }
}
7
Bean Winz

簡単な解決策は、Javaのセットを使用することです。

したがって、重複する値を自動的に削除するように設定します

コードには、コードを使用して直接設定するように配列を変換するよりも配列があります

Set<T> mySet = new HashSet<T>(Arrays.asList(someArray));
32

Setを学びます。それを学ぶのにかかる時間は、それを使用しない何かをコーディングするのにかかる時間よりも短いです。

始めましょう。これを置き換えます:

_String[] address = new String[100];_

これとともに:

Set<String> addresses = new HashSet<String>();

この:

_address[i] = email;_

これとともに:

addresses.add(email);

iはもう必要ありません。

完了です。すべてを印刷したい場合:

_for (String address : addresses) {
     System.out.println (address);
}
_

それはほとんどそれをカバーしています。すべてを自動的に並べ替えたいですか?上記のHashSetTreeSetに置き換えます。さあ、読んでください この優れたチュートリアル 次回は、すべてをより速く、自分で行うことができます。

5
sparc_spread

配列内の各要素を調べて別の要素に追加し、2番目の配列に次の項目が含まれているかどうかを確認します(スキップされている場合)。次に、1番目の配列を2番目の配列に置き換えるだけです。 (ただし、この場合はArrayListの方が適しています)。

だからこのようなもの:

List<String> FinalList = new ArrayList<String>();
for(string temp : adress)
{
if(!FinalList.contains(temp))
  FinalList.add(temp);
}
3
user1241335

代わりに HashSet にそれらを読んでください。これにより、重複が処理されます。

Set<String> addresses = new HashSet<String>();
addresses.add("[email protected]");
addresses.add("[email protected]");
addresses.add("[email protected]");
System.out.println(addresses.size());

印刷します1

3
krock

必要に応じてArrayUtilクラスを使用します。重複を削除する以外のいくつかのメソッドを作成しました。このクラスは、Collectionフレームワーククラスを使用せずに実装されます。

public class ArrayUtils {
/**
 * Removes all duplicate elements from an array. 
 * @param arr Array from which duplicate elements are to be removed.
 * @param removeAllDuplicates true if remove all duplicate values, false otherwise 
 * @return Array of unique elements.
 */
public static int[] removeDuplicate(int[] arr, boolean removeAllDuplicates)         {
    int size = arr.length;

    for (int i = 0; i < size;) {
        boolean flag = false;

        for (int j = i + 1; j < size;) {
            if (arr[i] == arr[j]) {
                flag = true;
                shrinkArray(arr, j, size);
                size--;
            } else
                j++;
        }

        if (flag && removeAllDuplicates) {
            shrinkArray(arr, i, size);
            size--;
        } else
            i++;
    }

    int unique[] = new int[size];
    for (int i = 0; i < size; i++)
        unique[i] = arr[i];

    return unique;
}

/**
 * Removes duplicate elements from an array. 
 * @param arr Array from which duplicate elements are to be removed.
 * @return Array of unique elements.
 */
public static int[] removeDuplicate(int[] arr) {
    return removeDuplicate(arr, false);
}


private static void shrinkArray(int[] arr, int pos, int size) {
    for (int i = pos; i < size - 1; i++) {
        arr[i] = arr[i + 1];
    }
}

/**
 * Displays the array.
 * @param arr The array to be displayed.
 */
public static void displayArray(int arr[]) {
    System.out.println("\n\nThe Array Is:-\n");

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

/**
 * Initializes the array with a given value.
 * @param arr The array to be initialized.
 * @param withValue The value with which the array is to be initialized.
 */
public static void initializeArray(int[] arr, int withValue) {
    for (int i = 0; i < arr.length; i++) {
        arr[i] = withValue;
    }
}

/**
 * Checks whether an element is there in the array. 
 * @param arr The array in which the element is to be found.
 * @param element The element that is to be found.
 * @return True if found false otherwise
 */
public static boolean contains(int arr[], int element) {
    for(int i=0; i< arr.length; i++) {
        if(arr[i] == element)
            return true;
    }

    return false;
}

/**
 * Removes a element from an array.
 * @param arr The array from which the element is to removed.
 * @param element The element to be removed
 * @return The size of the array after removing.
 */
public static int removeElement(int[] arr, int element) {
    int size = arr.length;
    for(int i=0; i< arr.length; i++){
        if(arr[i] == element){
            shrinkArray(arr, i, arr.length);
            size--;
        }
    }
    return size;
}

/**
 * Counts unique elements in an array.
 * @param arr The required array.
 * @return Unique element count.
 */
public static int uniqueElementCount(int arr[]) {
    int count = 0;
    int uniqueCount=0;
    int[] consideredElements = new int[arr.length];

    initializeArray(consideredElements, 0);

    for(int i=0;i<arr.length;i++) {
        int element = arr[i];
        for(int j=i+1;j<arr.length; j++){
            if(element != arr[j] && !contains(consideredElements, element)){
                consideredElements[count++] = element;
            }
        }
    }

    for(int i=0;i< consideredElements.length;i++)
        if(consideredElements[i]!=0)
            uniqueCount++;

    return uniqueCount;
}
}
1
Deepanjan Das

重複を削除したい場合は、次のような方法を試すことができます。

String[] address = new String[100]; // the array that contains all addresses
ArrayList<String> uniqueAddresses = new ArrayList<String>(); // create arraylist to contain all non-repeated addresses
for(String addr : address){ // cycle through the entire array
   if(!uniqueAddresses.contain(addr)){ // check if the address already there
      uniqueAddresses.add(addr); // add it
   }
}
0
user7973776

整数配列の重複を削除するには、以下のコードを使用してください。

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package test123;

import Java.util.ArrayList;
import Java.util.HashSet;

/**
 *
 * @author krawler
 */
public class Test123 {

    /**
     * @param args the command line arguments
     */
     public static ArrayList<Integer> removeDuplicates(ArrayList<Integer> list) {

        // Store unique items in result.
        ArrayList<Integer> result = new ArrayList<>();

        HashSet<Integer> set = new HashSet<>();

        
        for (Integer item : list) {

           
            if (!set.contains(item)) {
                result.add(item);
                set.add(item);
            }
        }
        return result;
    }

    public static void main(String[] args) {

        ArrayList<Integer> list = new ArrayList<>();
        list.add(12);
        list.add(12);
        list.add(8);
        list.add(6);
        list.add(4);
        list.add(4);
        list.add(2);
        list.add(1); 
           //int a[]={12,12,8,6,4,4,2,1}
        
        ArrayList<Integer> unique = removeDuplicates(list);
        for (int element : unique) {
            System.out.println(element);
        }
    }
}

/*run:
12
8
6
4
2
1
BUILD SUCCESSFUL (total time: 0 seconds)*/
0
Bipil Raut