• 締切済み

IteratorとConcurrentModificationException

IteratorにConcurrentModificationExceptionをthrowさせるやり方がわかりません。 配列に数字を挿入、削除するクラスをつくりました。 MyArrayにあるメソッド、変数 int [] array int mod // 挿入、削除の合計回数 初期値は0 add(int n) // nをarrayに挿入します delete() // 一番うしろの数字を削除します getMod() // modを返します iterator() // new ArrayIterator (array.length, mod) を返します。 modはadd()とdelete()が呼ばれるたびに1ずつ増えていくようにしています。ArrayIteratorはIteratorをimplementsしたクラスです。 <メインメソッドのコード> MyArray a = new MyArray (10); // サイズが10の配列をつくります a.add(1); a.add(2); a.add(3); a.add(4); Iterator it = a.iterator(); it.next(); // 配列の一番最初の数字を返します。 (i.e. 1) a.add(5); // 5を配列に挿入します。 // Iterator以外のメソッドで配列を変えてしまったので、 // ConcurrentModificationExceptionをthrowさせたいんです。 it.next(); // ここでConcurrentModificationExceptionをthrowしてくれません add()、 delete()、 getMod()はそのままにして全く変えずに、これができる方法ありますか?(その三つのメソッド以外は書きかえれます)it.next()だけでなく、it.hasNext()、it.remove()でも同じようにConcurrentModificationExceptionがthrowされるようにしたいのですが・・・。

noname#200754
noname#200754
  • Java
  • 回答数1
  • ありがとう数0

みんなの回答

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

ArrayIteratorとMyArrayの関係(内部クラスなのか否か)を補足して下さい。 >iterator() // new ArrayIterator (array.length, mod) を返します。 ここだけ見ると非内部クラスのように見えますが、ArrayIteratorのコンストラクタに与える引数がこれだけではIterator自体が実装出来るとは思えません。

関連するQ&A

  • プログラミングで困っています。

    メインメソッドで、 MyArray array = new MyArray(10); // サイズ10の配列をつくります。 を実行したとします。クラス MyArrayは配列にObjectを挿入、削除できるメソッド(add()とdelete())、+その他を追加したものです。 MyArrayクラスの中から、arrayを他のクラスに返すメソッドを作ることはできるんでしょうか?arrayの配列だけを返すのでなくて、MyArrayであるarrayそのものを返したいのですが、どうすればいいでしょうか。 理由は、他のメソッドから、arrayの配列に行われたadd()とdelete()の回数をモニターする必要があるからです。 *add()とdelete()には、呼ばれるたびに、int counterを1ずつ増やすようにしています。counterの数の変化によってarray配列が変化したかどうかモニターするわけです。

  • Iteratorの使用について

    いつもお世話になっています。 List使用時の、iterator方法について質問します。 Listに、以下の情報が入っている場合で、 UserFormBean userFormBean = new UserFormBean(); List array = new ArrayList(); array.add("ほのか"); array.add("なぎさ"); array.add("桃子"); array.add("雛菊"); array.add("百合"); array.add("陽介"); //ListにListを格納する List array2 = new ArrayList(); array2.add("酒蔵"); array.add(array2); //別クラスのデータをListに格納する userFormBean.setUserName("あかね"); userFormBean.setAge(15); /** UserFormBeanクラス **/ public class UserFormBean { private String userName; private int age; public String getUserName() { return this.userName; } public void setUserName(String userName) { this.userName = userName; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; } } このとき、文字列で入っている場合は、普通に取得できるが、 List毎入っている場合と別クラスが入っているうまく取得できません。 普通にfor()を使用すれば取得できるのですが、 このときiteratorを使用して取得することは可能なのでしょうか? また、一般的にこのような取得方法の場合、forとどちらを使用するべきなのでしょうか? 取得方法は以下です。 for(Iterator a = array.iterator(); a.hasNext();) { System.out.println("a="+a); System.out.println("value="+a.next() ); //このとき、a.next()から再度UserFormBeanクラスデータを取得したい } ◆取得結果 a=java.util.AbstractList$Itr@10b30a7 value=ほのか a=java.util.AbstractList$Itr@10b30a7 value=なぎさ a=java.util.AbstractList$Itr@10b30a7 value=桃子 a=java.util.AbstractList$Itr@10b30a7 value=雛菊 a=java.util.AbstractList$Itr@10b30a7 value=百合 a=java.util.AbstractList$Itr@10b30a7 value=陽介 a=java.util.AbstractList$Itr@10b30a7 value=[酒蔵] a=java.util.AbstractList$Itr@10b30a7 value=UserFormBean@1a758cb 宜しくお願いします。

    • ベストアンサー
    • Java
  • Iteratorの使い方でこまっています。

    こんにちは、片岡と言います。 Iteratorの使い方で困っています。 次のプログラムで自分の望んだ結果と違う動作をします。 原因やもっと良い方法をご存知の方はいませんか。 私の行った手順は以下です。 (1)次のようなプログラムを作りました。 import java.util.ArrayList; import java.util.Iterator; public class Main { ArrayList list; public static void main(String[] args) { Main instance = new Main(); Iterator it = instance.getIterator(); for (int i = 0; i < 3; i++) { Iterator temp = it; //Iterator temp = instance.getIterator(); while (temp.hasNext()) { System.out.print(temp.next()); } System.out.println(""); } } public Main() { list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); } public Iterator getIterator() { return list.iterator(); } } (2)このプログラムを実行しました。 abc (3)しかし、私の望んだ実行結果は、次のようなものでした。 abc abc abc (4)プログラムを次のように変更しました。 Iterator temp = it; の行を Iterator temp = instance.getIterator(); に変更しました。 変更後は、私の望んだ実行結果になります。 なぜ、Iterator temp = it では駄目なのでしょうか。 また、何度もIteratorを生成すると、処理が重くなる気がします。 もっと良い方法はないのでしょうか。 ご存知の方はいらっしゃいませんか。 なお、私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 開発環境:Eclipse 3.2.2 java: java version "1.4.2_13"

    • ベストアンサー
    • Java
  • C++ VS2005におけるイテレーターの動作

    過去にVisual Studio C++ 6.0 で作成したプロジェクトを、Visual Studio C++ 2005に変換し、ビルドしてみたところ、イテレーターに関する操作をしているところでエラーが出ました。 ---------- ソースの一部抜粋 ここから ------------- vector<char> array; // int型の動的配列 arrayに要素をpush_backする処理 while( it && it != array.end() ) // 末尾要素まで { cout << *it << endl; // *演算子で間接参照 ++it; // イテレータを1つ進める } ---------- ソースの一部抜粋 ここまで ------------- 上記のwile文のところで以下のようなエラーが発生します。 ---------- エラーメッセージ ここから ------------- error C2676: 二項演算子 '&&' : 'std::_Vector_iterator<_Ty,_Alloc>' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照) 1> with 1> [ 1> _Ty=char, 1> _Alloc=std::allocator<char> 1> ] ---------- エラーメッセージ ここまで ------------- とりあえず、"while( it && it != array.end() ) "を"while( *it!=NULL && it != array.end() ) "とするとエラーはでなくなりましたが、なぜもとのように書いてはダメなのかがさっぱりわかりません。 そもそも、itと*itでは、示す内容が違っているので、これでは解決になっていないのでは、という気もします。 ヘルプを見ても、VS6.0とVS2005でvectorやiteratorの動作が変わっていることが読み取れず、困っています。 どなたかご教授ください。

  • テストメソッド

    テストメソッドを使いプログラムを実行させたいのですが、テストメソッドにエラーが出て正常にプログラムが動くかどうか調べられません。 問題は、配列0の数字を、int型のnumShiftsで与えられた数字の回数だけ一番後ろへ移動させ、それ以外の配列の数字を左へシフトさせます。 つまり、一度配列0の中身を一番後ろに持っていくと、配列1の数字が配列0にくるので、それをまた一番後ろにもって行きます。 そしたら配列2の数字が配列0に来ます。それをまた一番後ろにもって行きます。それをnumShifts回繰り返します。 例) ({1,2,3,4,5,6,7}, 3) 3回移動→ {4,5,6,7,1,2,3} ({1,2,3,4,5,6,7}, 0) 0回移動→ {1,2,3,4,5,6,7} ({1,2,3}, 5) 5回移動→ {3,1,2} プログラムは以下のように組みました。 public class ArrayFun { public void shiftNTimes(int[] array, int numShifts) { for (int i = 0; i < numShifts; i++) { //numShifts回繰り返す for (int j = 0; j < array.length-1; j++) { //配列をシフト int temp = array[j+1]; array[j+1] = array[j]; array[j] = temp; } } } } テストメソッドは以下です。 import static org.junit.Assert.*; import org.junit.Test; public class ArrayFunTest { @Test public void testshiftNTimes() { ArrayFun af = new ArrayFun(); int[] a1 = { 1, 2, 3, 4, 5, 6, 7 };//元の配列 int[] a2 = { 1, 2, 3, 4, 5, 6, 7 };//元の配列 int[] a3 = { 1, 2, 3 };//元の配列 int[] a4 = { 4, 5, 6, 7, 1, 2, 3 };//シフト後の配列 int[] a5 = { 1, 2, 3, 4, 5, 6, 7 };//シフト後の配列 int[] a6 = { 3, 1, 2 };//シフト後の配列 assertEquals(a4, af.shiftNTimes(a1, 3)); assertEquals(a5, af.shiftNTimes(a2, 0)); assertEquals(a6, af.shiftNTimes(a3, 5)); } } エラーは、assertEqualsに赤線が出てしまうことです。 このタイプのAssertでのassertEquals(Object, Object)は、(int[], void)に適切ではないと表示されます。 他のテストメソッドではこのようなエラーは出ないのですが・・・。どなたか解決方法をご存知であれば宜しくお願いします。

    • ベストアンサー
    • Java
  • JavaScriptの連想配列について

    myArray = new Array();  myArray["A001"] = new Array();   myArray["A001"]["B001"] = "B001";   myArray["A001"]["B002"] = new Array();    myArray["A001"]["B002"]["C001"] = "C001";    myArray["A001"]["B002"]["C002"] = "C002";  myArray["A002"] = "A002"; JavaScriptの連想配列について質問させて頂きます。 例えば上記のような配列があったとして、値とキーはそのままで "C001" と "C002" の"B002"配列への格納順序だけ入れ替えたい場合、 どのように実装すればよろしいでしょうか? ちなみにキーや値はサンプルで実際にはsort出来るルールはありません。。。 ※入れ替え後のイメージ --------------------------------------------------------------------- myArray = new Array();  myArray["A001"] = new Array();   myArray["A001"]["B001"] = "B001";   myArray["A001"]["B002"] = new Array();    myArray["A001"]["B002"]["C002"] = "C002"; ←格納順序が    myArray["A001"]["B002"]["C001"] = "C001";  入れ替わった  myArray["A002"] = "A002"; ---------------------------------------------------------------------

  • Iteratorパターンの亊で、質問します。

    Iteratorパターンの亊で、質問します。 いつもお世話になっています。 http://www.techscore.com/tech/DesignPattern/Iterator.html#dp1-2, http://www.techscore.com/tech/DesignPattern/Iterator2.htmlを参考にしたのですが、 このとき、Mainクラスを実行してもなにも表示されません。 それで、直してみました。 おそらく、原因は、StudentListクラスのaddメソッドだと思ったのですが、 変更した、StudentListクラス、、、 public class StudentList { protected Student[] students; private int last = 0; public StudentList(int studentCount) { this.students = new Student[studentCount]; } public void add(Student student) { System.out.println("student --"); System.out.println(student.getName() ); //ここに原因がある。。。 students[last] = student; //追加... last++; } public Student getStudentAt(int index) { return students[index]; } public int getLastNum() { return last; } 実行にあたり、使用したクラスなどは、 Student,StudentList,Teacher,Main、です。 また、他にも、方法があるというのですが、 どんなのがあるかよくわかりません。 なんらかのヒントをもらえないでしょうか? http://okwave.jp/qa/q5886678.htmlの問い、と被るのですが、 DBの接続、データ取得の汎用的な処理をDB接続用のクラスにもたせて、 具体的な取得方法など別に用意して、そのクラスに渡すというやりかたです。 この場合の考えかたを、Iteratorで考えるのはどうなのでしょうか? このやり方だと、仮に、Teacherインターフェースに追加されると、 MyTeacherクラスにも追加が要求され、手間がかかる。 この場合、もっとも汎用性があるソースとはどんなのなのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 配列について

    var myarray=new Array(); myarray[0]="a"; myarray[1]="b"; myarray[2]="c"; myarray[3]="b"; myarray[4]="a"; myarray[5]="d"; のような配列があります。ここから重複しないようにa,b,c,dだけを抜き出すのにはどのようにJavascriptで書いたらよいのでしょうか。 よろしくお願いします。

  • HashSetのデータをファイルにしたい

    HashSetのデータをファイル化したいのですが、どのようにすればよいでしょうか?以下のコードで画面出力は出来るのですが、BufferedWriterのwriteメソッドでファイルに追記したくてもそれぞれの文字列の長さはデータ毎にサイズが異なるためwrite(String s, int off, int len) が使えそうにありません。どうすればファイル化出来るでしょうか?もしくは、HashSetにこだわるつもりはないので、HashSet以外で、一意性を保証するコレクションクラスがあればそちらの書き方でも構いません。 public class TestHash { public static void main(String[] args) throws Exception { HashSet hs = new HashSet(); hs.add("aiueo"); hs.add("kakikukeko"); hs.add("sashisuseso"); Iterator it = hs.iterator(); FileWriter writer = new FileWriter("/home/taro/aaa.txt"); BufferedWriter bwriter = new BufferedWriter(writer); while(it.hasNext()) { System.out.println(it.next()); //画面出力はこれでOK bwriter.write(it.next()); //これはNG } bwriter.close(); } }

    • ベストアンサー
    • Java
  • 【PHP】配列の最後の要素のキーを知るには

    以下のような乱雑な配列があったとして中身がわからない場合、最後の要素のキーが「12」であることを知るにはどうすればいいでしょうか? お詳しい方、よろしくお願いいたします。 $myArray = array(); $myArray[2] = ''; $myArray[5] = 'a'; $myArray[9] = NULL; $myArray[12] = 'z';

    • ベストアンサー
    • PHP