0

所以我收到了一组电子邮件,我应该阅读它们,将它们存储在一个数组中,删除重复项,然后打印“剩菜”。我几乎可以做到这一点,但是在删除重复项后,当我打印剩菜时,它会打印一个额外的null.

这是我的代码。有人可以指出我修复它的方向吗?

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];

        for(int i=0;inputStream.hasNextLine();i++){
            String email = inputStream.nextLine();
            address[i]=email.toLowerCase();
            //System.out.println(address[i]);
        }


        Set<String> mail = new HashSet<String>(Arrays.asList(address));

        for(String email:mail){
            System.out.println(email);
        }
4

5 回答 5

5

我假设您阅读的地址少于 100 个。数组地址中的其余元素为空。这就是空值的原因。

将固定大小的数组替换为ArrayList<String>

List<String> address = new ArrayList<String>();
//...
    address.add(email.toLowerCase());
    // ...

您还必须替换集合的构造:

Set<String> mail = new HashSet<String>(address);
于 2012-04-07T20:02:27.487 回答
3

您正在尝试从文件中读取固定数量的 [100] 个元素。

如果有更多的电子邮件,你会错过一些,如果有更少 - 你会null留下一些[Set将折叠成一个单一的null]。

尝试使用 aArrayList而不是数组,或者Set从一开始就使用 a ..

于 2012-04-07T20:03:06.223 回答
1
String [] address = new String[100];  

改变

SortedSet<String> address = new TreeSet<String>();   

address[i]=email.toLowerCase();  

改变

address.add(email.toLowerCase());
于 2012-04-07T20:06:37.530 回答
0

您的代码有几个问题。

  • 您使用扫描仪从文件中读取,这是我很少见过的,我自己也从来没有做过。FileInputStream 类为此目的进行了更多优化。

  • 您使用固定大小的数组来存储未知数量的字符串

  • 您将 for 循环用于未知数量的循环迭代。这没有错,但是while循环更合适。

  • 您从一个数组创建一个新的 HashSet。同样没有错,但是为什么您没有在循环中使用 HashSet 呢?您本来可以避免一起使用索引。

我假设您是一个刚开始编写一些代码以自动化您不想手动执行的操作的初级程序员。这当然没有错,在这种情况下,只需使用 ArrayList,因为无论如何,在您的情况下,所有 String 对象都保证是唯一的:

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


ArrayList<String> addresses = new ArrayList<String>();

for(int i=0;inputStream.hasNextLine();i++){
    String email = inputStream.nextLine();
    address.add(email.toLowerCase());
    //System.out.println(email);
}

for(String email:addresses){
    System.out.println(email);
}

有适当的进口。注意:这是最小的变化,还有一些可以改进的地方,见上文。祝你好运!

于 2012-04-07T20:21:38.210 回答
0

只需这样做:

Set<String> addresses = new HashSet<String>(); // use a Set

while (inputStream.hasNextLine()) {
    addresses.add(inputStream.nextLine().toLowerCase()); // in-line unused variable
}

for (String email : mail) {
    System.out.println(email);
}
于 2012-04-07T20:08:38.473 回答