1

私は次のような単純な問題をコーディングしようとしていました:

今週は、部門全体の重要な会議があります。あなたは上司がそれについてあなたに話したことをはっきりと覚えています。忘れてしまったのは、会議が行われる曜日だけです。

あなたは6人の同僚に会議について尋ねました。誰もそれが起こる日を知りませんでした、しかし彼らのそれぞれはそれが起こらない日を覚えていました。彼らが覚えていた日ははっきりしていた。あなたのような賢いプログラマーにとって、これは会議の日を決定するのに十分でした。

これで、2つの配列を作成しました。1つはすべての平日を含み、もう1つは会議が行われないすべての日を含み、それらから2つのリストを作成しました。

public static void main(String[] args) {
    String[] notOnThisDay={"Sunday", "Monday", "Tuesday", "Wednesday",   "Thursday", "Friday"};
    String[] weekdays={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    List<String> list1=Arrays.asList(weekdays);
    List<String> list2=Arrays.asList(notOnThisDay);
    Iterator<String> iter=list1.iterator();
    
    while(iter.hasNext()) {
        if(list2.contains(iter.next())) {
            iter.remove();
        }
    }

    for(String x:list1) {
        System.out.println(x);
    }
}

私の戦略は、平日リストをトラバースnotonThisDayすることでした。リストに含まれている日が見つかった場合は、それを削除します。そのため、会議の当日は残っていますが、iter.remove()方法に問題があるようです。

エラーを指摘してください。そして、私のアルゴリズムが良ければアドバイスをください。もしあれば、より良いアルゴリズムの提案を受け入れます。

4

7 に答える 7

2

コレクションには完璧な removeAll() メソッドがあります。

于 2012-07-15T06:05:09.997 に答える
2

asList によって返されるリストは非常に限定されており、削除はまったくサポートされていません。リンクされたリストを作成し、すべてのアイテムを em に追加し、中間反復の削除に関するドキュメントを読んでください。または、他の解決策のいずれかを使用してください。

于 2012-07-15T06:17:33.880 に答える
2

あなたの問題はArrays.asList()、固定サイズのリストを返すことです。new ArrayList( ... )またはなど、既知のタイプのリストのコンストラクターのいずれかを使用することをお勧めしますnew LinkedList( ... )

于 2012-07-15T06:18:17.623 に答える
1

6 つの異なる日がオンになっていない場合、最終的なリストが 1 を超える可能性はありません。そのため、リストにない曜日を見つけたら探すのをやめることができますnotOnthisDay。したがって、Setオンになっていない曜日のセットを使用して、簡単な検索を行います。

Set notDays = new HashSet(notOnThisDay);
String dayOfMtg = null;
for(String day : weekdays) {
   if(notDays.contains(day) {
      //Store response
      dayOfMtg = day;
      //Stop searching, you've found it.
      break;
   }
}
System.out.println("Meeting is on: "+dayOfMtg);
于 2012-07-15T06:13:36.243 に答える
1

LinkedList変更中のリストに使用します。

List<String> list1=new LinkedList<String>(Arrays.asList(weekdays));

それが動作します。 Iterator.remove() はオプションの操作であり、すべての Iterator またはその基になるコレクションでサポートされているわけではありません。

基になるコレクションから、反復子によって返された最後の要素を削除します (オプションの操作)。このメソッドは、next への呼び出しごとに 1 回だけ呼び出すことができます。反復の進行中に、このメソッドを呼び出す以外の方法で基になるコレクションが変更された場合、反復子の動作は規定されていません。

例外: UnsupportedOperationException - 削除操作がこの Iterator でサポートされていない場合。IllegalStateException - 次のメソッドがまだ呼び出されていない場合、または次のメソッドの最後の呼び出しの後に remove メソッドが既に呼び出されている場合。

于 2012-07-15T06:19:49.180 に答える
0

一般的に言えば、繰り返し処理しているコレクションから何かを削除するときは注意が必要です。おそらく、これを回避する方法を見つけることができますか?

于 2012-07-15T06:06:58.503 に答える
0

Arrays.asList変更不可能なリストを作成します。Javadocから: 指定された配列に基づく固定サイズのリストを返します。追加することはできません。そこから削除することはできません。リストを構造的に変更することはできません。

次のように変更可能なリストにラップします。

someList.addAll(Arrays.asList(newArray));

これにより、少し余分なガベージが作成されますが、変異させることができます。

コードは次のようになります。

public static void main(String[] args) 
{
    String[] notOnThisDay={"Sunday", "Monday", "Tuesday", "Wednesday",   "Thursday", "Friday"};
    String[] weekdays={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    //List<String> list1=Arrays.asList(weekdays);
    //List<String> list2=Arrays.asList(notOnThisDay);

    List<String> list1=new ArrayList<String>();
    List<String> list2=new ArrayList<String>();
    list1.addAll(Arrays.asList(weekdays));
    list2.addAll(Arrays.asList(notOnThisDay));

    Iterator<String> iter=list1.iterator();
    //ListIterator<String> iter = list1.listIterator();  Better to use

    while(iter.hasNext()) {
        if(list2.contains(iter.next())) {
            iter.remove();
        }
    }

    for(String x:list1) {
        System.out.println(x);
    }
}
于 2012-07-15T06:35:29.603 に答える