2012-04-07 2 views
7

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

Мне удалось заставить мой try/catch работать и распечатывать адреса электронной почты. Тем не менее, я не уверен, как сделать удаление дубликатов. У меня нет понимания hashcode или того, как использовать 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++; 
     } 
     } 
    } 
} 
+0

Вы ищете наиболее эффективное решение возможно? Если нет, просто создайте новый массив и повторите попытку через старый, добавив, когда вы пойдете после проверки, является ли текущая запись уже в новом массиве. – jli

+0

@jli просто так сказал перед вами: P. Это может быть не самое эффективное решение, но ад. –

+1

Возможный дубликат [Как удалить повторяющиеся элементы из ArrayList?] (Http://stackoverflow.com/questions/203984/how-do-remove-repeated-elements-from-arraylist) – Mark

ответ

2

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

так что-то вроде этого:

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

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

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

+1

Theres нет точки сортировки. – Kevin

-1

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

31

Простое решение состоит в том, что использование Набор Явы,

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

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

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

+1 это простейшее решение – jli

+0

+1, я никогда не делал хешей, хотя есть список <> может быть полезным = 3 –

+1

спасибо. Наверное, я могу попробовать - я даже никогда не слышал о наборах раньше, поскольку я только начинаю программировать. Итак, что же такое и что делает .asList? –

4

Узнать 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. Теперь перейдите в this excellent tutorial, чтобы в следующий раз вы могли сделать все это быстрее и по своему усмотрению.

+0

спасибо ... кажется достаточно легким, но я должен использовать массивы –

+1

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

1

Используйте класс ArrayUtil по мере необходимости. Я написал несколько методов, кроме удаления дубликатов. Этот класс реализуется без использования каких-либо классов Framework 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

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

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

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

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

 
\t 
 
\t for (Integer item : list) { 
 

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

 
    public static void main(String[] args) { 
 

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

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

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