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

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

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

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

Q&A

解決済

2回答

3421閲覧

JavaのArrayListでremoveが上手くいかない

tetra

総合スコア19

Java

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

0グッド

1クリップ

投稿2020/04/09 16:55

前提・実現したいこと

独自のクラスを引数にインスタンス化したArrayListで、removeをしたい

発生している問題・エラーメッセージ

falseで削除できない

該当のソースコード

java

1package dictionary; 2 3import java.util.ArrayList; 4import java.util.Collections; 5import java.util.Iterator; 6import java.util.List; 7 8public class Dictionary { 9 @SuppressWarnings("rawtypes") 10 private List dictionaryList; 11 private int displayNumber; 12 13 public int getDisplayNumber() { 14 return displayNumber; 15 } 16 17 public void setDisplayNumber(int displayNumber) { 18 this.displayNumber = displayNumber; 19 } 20 21 public Dictionary() { 22 dictionaryList = new ArrayList<>(); 23 } 24 25 @SuppressWarnings("unchecked") 26 public void put(String word, String explanation)throws NullPointerException{ 27 dictionarySet dSet = new dictionarySet(word,explanation); 28 dictionaryList.add(dSet); 29 Iterator<dictionarySet> iterator = dictionaryList.iterator(); 30 /*for(@SuppressWarnings("rawtypes") 31 ListIterator it = dictionaryList.listIterator(dictionaryList.size()); it.hasPrevious();) { 32 if(it.previous().equals(word)) { 33 dictionaryList.remove(iterator.next().getWord()); 34 } 35 }*/ 36 while(iterator.hasNext()) { 37 //String removeStr = ; 38 if(iterator.next().getWord().equals(word) && iterator.hasNext() == true){ 39 System.out.println(dictionaryList.remove(word)); 40 break; 41 } 42 } 43 /*iterator = dictionaryList.iterator(); 44 while (iterator.hasNext()) { 45 System.out.println(iterator.next().getWord()); 46 }*/ 47 48 //dictionaryList.add(dSet); 49 } 50 51 public void getAll() { 52 sort(); 53 @SuppressWarnings("unchecked") 54 Iterator<dictionarySet> it = dictionaryList.iterator(); 55 while (it.hasNext()) { 56 dictionarySet data = it.next(); 57 System.out.println(data.getWord() + ":" + data.getExplanation()); 58 } 59 } 60 61 public void getOnePage(int page) { 62 63 } 64 65 @SuppressWarnings("unchecked") 66 public void sort() { 67 Collections.sort(dictionaryList); 68 } 69 70 public void clear() { 71 dictionaryList.clear(); 72 } 73} 74
package dictionary; public class dictionarySet implements Comparable<dictionarySet>{ private String word; private String explanation; public dictionarySet(String word, String explanation) { super(); this.word = word; this.explanation = explanation; } public String getWord() { return word; } public void setWord(String word) { this.word = word; } public String getExplanation() { return explanation; } public void setExplanation(String explanation) { this.explanation = explanation; } @Override public int compareTo(dictionarySet dictionarySet){ return word.compareTo(dictionarySet.word); } }

試したこと

勉強中なのでできる限りjavadocなどドキュメントを読み漁りましたが分かりません。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

swordone

2020/04/09 17:31

実際に実行しているコードを提示してください。
guest

回答2

0

自己解決

自己解決したました。
ご協力下さった皆さんありがとうございます。
調べたところIteratorは受け取ったコレクションのアドレスを参照すると言うことで、
if(iterator.next().getWord().equals(word) && iterator.hasNext() == true){
iterator.remove()
}
これで指定した要素を含む場合(重複する場合)だけremoveすることができました。
次回から質問の内容はより細かく記載したいと思います。

投稿2020/04/10 00:49

tetra

総合スコア19

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

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

0

iterator を使用中にその元である List から直接 remove することはできません.
iterator の remove メソッドを使うか, iterator を使わずにループしてください.

失礼しました.
false というのは

System.out.println(dictionaryList.remove(word));

のことですね

remove

(o==null ? get(i)==null : o.equals(get(i)))となる、最小のインデックス値iを持つ要素を削除します

ですので, (word が null で無ければ) word.equals(dictionaryList.get(i)) が成立しなければ削除にはなりません.
word は String であり, dictionaryList.get(i) は dictionarySet ですから, どうやっても削除されないでしょう. ( dictionarySet には equals や hashCode の定義もありません.)

なお, この状態は @SuppressWarnings など付けずに List<dictionarySet> dictionaryList ときちんと型を書いてあれば, Eclipse において該当行で「ありそうもない Collenction<dictionarySet> の remove(Object) の引数型 String」(Plaiades訳) という警告が出て気付けます.

#追記
put が「word が重複したら上書き」するというのであれば, そして内部では word でソートするのであれば, TreeMap を使用しては如何でしょうか.
自分で探して削除したりソートしたりは必要無くなります.

java

1package teratail.q252580; 2//package dictionary; 3 4import java.util.*; 5 6public class Dictionary { 7 private Map<String,Item> map = new TreeMap<>(); 8 private int displayNumber; 9 10 public static void main(String args[]) { 11 Dictionary dic = new Dictionary(); 12 dic.put("B", "BBB"); 13 dic.put("C", "CCC"); 14 dic.put("A", "AAA"); 15 dic.printAll(); 16 System.out.println(); 17 dic.put("B", "BBBbbbbb"); 18 dic.printAll(); 19 } 20 public int getDisplayNumber() { 21 return displayNumber; 22 } 23 public void setDisplayNumber(int displayNumber) { 24 this.displayNumber = displayNumber; 25 } 26 public void put(String word, String explanation) { 27 map.put(word, new Item(word, explanation)); 28 } 29 public void printAll() { 30 map.forEach((k,v) -> System.out.println(v)); 31 } 32 public void getOnePage(int page) { 33 } 34 public void clear() { 35 map.clear(); 36 } 37 38 private static class Item implements Comparable<Item>{ 39 private String word; 40 private String explanation; 41 42 public Item(String word, String explanation) { 43 this.word = word; 44 this.explanation = explanation; 45 } 46 @Override 47 public int compareTo(Item item){ 48 return word.compareTo(item.word); 49 } 50 @Override 51 public String toString() { 52 return word + ":" + explanation; 53 } 54 } 55}

plain

1A:AAA 2B:BBB 3C:CCC 4 5A:AAA 6B:BBBbbbbb 7C:CCC

投稿2020/04/09 17:16

編集2020/04/10 02:40
jimbe

総合スコア12670

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

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

tetra

2020/04/10 00:43

早速のご返信ありがとうございます。 メンバー変数をList< dictionarySet>に変更することで警告が消えました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問