Вопрос по arrays, java – Java удалить дубликаты из массива?

7

Я должен прочитать файл, содержащий много разных адресов электронной почты, и распечатать их с помощью массива. Проблема в том, что мне нужно удалить дубликаты писем.

Я смог заставить свою попытку / поймать работу и распечатать адреса электронной почты. Тем не менее, я не уверен, что делать с удалением дубликатов. У меня нет понимания хэш-кода или того, как использовать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++;
         }
      }
   }
}
@jli только что сказал перед вами: P. Это может быть не самое эффективное решение, но ад. user1241335
возможный дубликатHow do I remove repeated elements from ArrayList? Mark
Вы ищете наиболее эффективное решение? Если нет, просто создайте новый массив и выполните итерацию по старому, добавляя по мере того, как вы проверяете, есть ли текущая запись в новом массиве. jli
@Bean Winz - Добро пожаловать в stackoveflow. В будущем, если ваш вопрос является домашним заданием, обязательно добавьтеhomework тег. Leigh

Ваш Ответ

9   ответов
3

Вы можете попробовать просмотреть каждый элемент массива, добавить его к другому, проверить, содержит ли второй массив следующий элемент, если он пропустил его. Затем просто замените 1-й массив на 2-й. (ArrayList лучше в этом случае, хотя).

так как то так:

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

Вы можете написать функцию, которая будет работать в массиве и получать по одному электронному письму за раз, и когда он найдет тот же адрес, просто установите его в null. когда вы запускаете массив для его печати, создайте условие для печати электронного письма, только если оно не равно нулю

0

Пожалуйста, используйте приведенный ниже код для удаления дубликатов в массиве целых чисел.

/*
 * 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)*/

-1

первое, что приходит мне в голову, это отсортировать массив, а затем проверить, равен ли следующий элемент текущему элементу. если так, удалите текущий элемент.

о, и когда вы не знаете, сколько писем хранится в файле, массив, вероятно, не самый лучший способ. Я бы взял какой-то список, так что мне не нужно заботиться о том, сколько адресов электронной почты содержится в файле.

нет смысла сортировать.
31

Простое решение заключается в том, что использовать набор Java,

поэтому установите удаление двойного значения автоматически

и в вашем коде у вас есть массив, чем преобразовать массив для установки непосредственно с помощью кода

Set<T> mySet = new HashSet<T>(Arrays.asList(someArray));
Благодарю. Я думаю, что могу попробовать - я просто никогда не слышал о наборах раньше, так как я только начинаю программировать. Так что же такое & lt; T & gt; и что делает .asList? Bean Winz
спасибо, я только что понял эту часть. Но я запутался, где поставить этот код. я бы положил его в свой цикл while? Bean Winz
Нет. Сначала создайте массив в вашемwhile цикл, затем после завершения массива, преобразовать его в набор. Затем пройдитесь по набору и распечатайте все адреса. Вы можете использовать что-то вродеfor(String s : mySet) System.out.println(s);
Привет Бин, если вы используете Set mySet = new HashSet (Arrays.asList (someArray)); чем нормально, но если вы хотите создать набор определенного типа данных, чтобы вы могли указать тип данных вместо T ex Set & lt; String & gt; set = new Hashset & lt; String & gt; () ;.
T является заполнителем для любого типа данных, который вы хотите использовать (String в твоем случае). Эта запись немного продвинута для тех, кто только начинает, так что не беспокойтесь об этом сейчас. Изучите основы какthis collections tutorial первый иT вещи будут казаться немного более естественными, когда вы столкнетесь с этим.
1

Используйте класс 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;
}
}
0

Если вы хотите удалить дубликаты, вы можете попробовать что-то вроде этого:

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
   }
}
5

Учить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);
}

Это в значительной степени покрывает это. Хотите, чтобы все было автоматически отсортировано? ЗаменитьHashSet выше сTreeSet, Теперь иди читатьэтот отличный учебник так что в следующий раз вы сможете все сделать быстрее и самостоятельно.

спасибо ... кажется достаточно простым, но я должен использовать массивы Bean Winz
Можете ли вы рассказать мне немного больше об ограничениях задания? Я удивлен, что они позволяют использовать только массивы, учитывая, что список адресов имеет произвольную длину (по сравнению с фиксированной длиной массива).
3

Прочитайте их в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.

Похожие вопросы