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

简单的解决方法是使用Java的Set,

所以设置自动删除重复的值

在你的代码中你有数组而不是转换数组直接使用代码设置

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

学习Set 。 你需要花费的时间less于编码不使用它的时间。

我会让你开始。 replace这个:

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

这几乎涵盖了它。 想要一切都自动sorting? 用TreeSetreplace上面的HashSet 。 现在去阅读这个优秀的教程,以便下一次,你可以更快,自己做到这一切。

把它们读入HashSet 。 这将为您处理重复。

 Set<String> addresses = new HashSet<String>(); addresses.add("a@a.com"); addresses.add("a@a.com"); addresses.add("a@a.com"); System.out.println(addresses.size()); 

将打印1

您可以尝试遍历数组中的每个元素,将其添加到另一个元素,检查第二个数组是否包含下一个项目,如果它跳过它。 然后用第二个replace第一个数组。 (虽然ArrayList在这种情况下更好)。

所以像这样的东西:

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

根据需要使用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; } } 

请使用下面的代码来删除整数数组中的重复项。

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

如果你想删除重复,你可以尝试这样的事情:

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

我头脑中的第一件事是对数组进行sorting,然后检查下一个元素是否等于当前元素。 如果是的话,删除当前元素。

哦,当你不知道有多less电子邮件存储在文件中,数组可能不是最好的方法。 我将采取某种列表,以便我不必关心文件中有多less电子邮件地址。

你可以编写一个在数组上运行的函数,并且一次接收一封邮件,并且当它find相同的地址时,只需将其设置为空。 当你在数组上运行时打印它,只有当它不为空时,才能创build一个打印电子邮件的条件