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 未満のアドレスを読んでいると仮定します。配列アドレスの残りの要素は null です。これがヌル値の原因です。

固定サイズの配列を次のものに置き換えます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]。

ArrayList配列の代わりに a を使用するか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 を使用しなかったのはなぜですか? インデックスを一緒に使用することは避けたでしょう。

あなたは、手動でやりたくないことを自動化するためにいくつかのコードを作成したばかりの初心者プログラマーであると想定しています。もちろん、それで問題はありません。その場合は、すべての String オブジェクトがとにかく一意であることが保証されているため、ArrayList を使用してください。

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 に答える