質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

6144閲覧

JAVA Listから重複項目の表示について

kumakumatan

総合スコア213

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/06/16 07:16

JAVAでオブジェクトを定義してEメールアドレスなどの重複を表示するプログラムを作成しています。

JAVA

1public class User { 2 /** メールアドレス */ 3 private String email; 4 5 public String getEmail() { 6 return email; 7 } 8 9 public void setEmail(String email) { 10 this.email = email; 11 } 12 13}

JAVA

1import java.util.HashSet; 2import java.util.List; 3import java.util.Set; 4 5public class Test { 6 7 public static void main(String[] args) { 8 // ここにコードを挿入 9 // メールアドレスset 10 Set<String> set = new HashSet<String>(); 11 12 13 List<User> userList = asList('ABC@', 'testa@', 'ABC@', 'testb@'); 14 15 for(User user : userList) { 16 String bufEmail = user.getEmail(); 17 if(set.contains(bufEmail)) { 18 // 存在する場合 19 System.out.println(bufEmail + "が重複しています。"); 20 } else { 21 // 存在しない場合、setに追加 22 set.add(bufEmail); 23 } 24 } 25 26 } 27 28}

この処理を実施して、「ABC@」が重複しています。
と表示させたいです。
Testクラスの「List<User> userList = asList('ABC@', 'testa@', 'ABC@', 'testb@');」
の記述が間違っているみたいですが、どこが間違いなのか教えていただきたく思います。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2016/06/16 07:27 編集

質問者様のスキルの確認です。1.Userクラスのインスタンスを1つ生成して、emailを設定するコードを書けますか? 2.Listを使ったことがありますか?
guest

回答5

0

Set.addメソッドは、実行した結果Setが変更された場合(=Setに引数の要素がなかった場合)trueを返し、変更されなかった場合(=Setに引数の要素があった場合)falseを返します。これを利用して判別できます。
あと、先の人も回答していますが、asListはArrays.asListでしょうか?

java

1public class Test { 2 3 public static void main(String[] args) { 4 // ここにコードを挿入 5 // メールアドレスset 6 Set<String> set = new HashSet<String>(); 7 8 // java.util.Arraysをインポート 9 List<String> userList = Arrays.asList("ABC@", "testa@", "ABC@", "testb@"); 10 11 for(String user : userList) { 12 //setに追加してみて、追加できなかった(重複していた)場合 13 if(!set.add(user)){ 14 System.out.println(user + "が重複しています。"); 15 } 16 } 17 18 } 19 20}

投稿2016/06/17 01:10

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2016/06/17 02:12

ありがとうございます。 とても素晴らしいです。
guest

0

List<String> userList = Arrays.asList("ABC@", "testa@", "ABC@", "testb@");

これで、連続した文字列(String)をList型のクラスへ格納できます。一気に別の型(Userなど)へ変換する場合には、文字列からUserを作るための変換処理が必要です。

Userへの変換処理はとりあえず置いて、まずはそれぞれの文字列の重複がないかを調べる、で良いかと思いますよ。

投稿2016/06/16 08:30

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Java

1class User { 2 3 private String email; 4 5 public User(String email) { 6 this.email = email; 7 } 8 9 public String getEmail() { 10 return email; 11 } 12 13 public void setEmail(String email) { 14 this.email = email; 15 } 16} 17 18public class Main { 19 public static void main(String[] args) throws Exception { 20 List<User> userList = Arrays.asList( 21 new User("ABC@"), 22 new User("testa@"), 23 new User("ABC@"), 24 new User("testb@")); 25 26 userList.stream() 27 .collect(Collectors.groupingBy(User::getEmail, Collectors.counting())) 28 .forEach((k, v) -> { 29 if (v > 1) { 30 System.out.println(k + " が重複しています。"); 31 } 32 }); 33 } 34}

投稿2016/06/16 08:25

root_jp

総合スコア4666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2016/06/16 09:03

ご回答ありがとございます。 こちらの処理は今は直接、値を設定していますが。例えば下記のようなCSVファイルを読み込んで、処理する場合はどうなりますでしょうか? ===CSVファイル====== ABC123,テスト A,123456,060-5938-1234, ABC456,テスト B,1234567,060-7886-567, ABC789,テスト C,1234568,060-3981-8910, ABCD123,テスト D,123459,060-6487-8911, ABCD456,テスト E,123459,060-4697-8912,テスト ABCD789,テスト F,1234581,060-4577-8913, ABCD12,テスト G,1234582,060-1266-8914, ABCD34,テスト H,12345834,060-7412-8915, ======================================== 3列目のチェックをして「123459が重複しています。」とメッセージを表示させていです。 宜しくお願いします。
guest

0

ベストアンサー

突っ込みどころが多すぎて…

まず第一にasListというメソッドはあなたのコード上存在していません。
おそらく以下のような処理を期待していると思います。

Java

1public class Test { 2 public static void main(String[] args) { 3 //省略 4 } 5 private static List<User> asList(String... emails) { 6 List<User> list = new ArrayList(); 7 for(int i=0;i<emails.length;i++) { 8 User user = new User(); 9 user.setEmail(emails[i]); 10 list.add(user); 11 } 12 return list; 13 } 14}

次にasListに渡す引数がシングルクォーテーションで書かれていることが問題です。
Javaでのシングルクォーテーションは「文字」であり、「文字列」ではありません。2文字以上の長さの文字列はダブルクォーテーションで囲む必要があります。

余談ですが、そもそもJavaのSetクラスは重複を自動で判定してくれます。
とりあえず全メールアドレスを突っ込めば、変数setの中はダブリのないメールアドレス一覧になっています。
重複である、というメッセージを出すことが目的であれば、判定部分はいまのままのコードで大丈夫です。

#追記
追加したasListはstaticメソッドというものです。メソッドを定義すべき場所、staticの意味を理解できていないのでしたら、そのへんは必ず勉強したほうが今後のためになるでしょう。

投稿2016/06/16 07:27

編集2016/06/16 08:06
masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2016/06/16 07:41

ご回答ありがとうございます。 記載していただいたコードをどの部分に埋め込めばいいでしょうか? Testクラスの中に記載したらよろしいでしょうか? 宜しくお願いします。
masaya_ohashi

2016/06/16 07:49

ちょっと訂正しました。 Testクラスのmainから呼び出すのであれば、Testクラスの中で、かつstaticをつけてメソッド定義すればよいです。
kumakumatan

2016/06/16 08:00

ありがとうございます。 頭の中がぐちゃぐちゃになりました。 具体的にどのように記載したらよいかご教授いただけますでしょうか? お願いします。
kumakumatan

2016/06/16 08:39

ありがとうございます。 やりたい事ができました。 「static」はプログラム実行開始直前に1つだけ実体化され、プログラム終了まで存在し続けるとの認識です。 「asList(String... emails)」の「...」は何を意味するのでしょうか。 宜しくお願いします。
masaya_ohashi

2016/06/16 08:50 編集

staticの認識はそれで正しいです。 ...は可変長引数と呼ばれるもので、可変長引数とは長さを自由に持つことができる引数です。 asListには今4つの引数が渡されていますが、そこにいくらでも書き足すことで一気に10個だろうが100個だろうが渡せます。そして、asListで受け取ったemailsは配列としてアクセスすることが可能です。 渡された可変長引数は必ず引数の最後に書かなければいけないという制約がありますが、使い方を知っていれば便利なものです。詳しくは自分で調べてみてください。
guest

0

asListはどのクラスのメソッドですか?見たことありません。
また、シングルクォーテーションで文字を囲っていますが、ダブルクォーテーションの誤りじゃないでしょうか。

リストを作るのであればArrayListをインスタンス化し、ArrayList#addで要素を追加しましょう。

投稿2016/06/16 07:22

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問