1

1問目の続きである2問目。文字列のリストが 2 つあります。文字列 (asu) のリスト (M1、M2、M3 ...) と、文字列 (rzs) のリスト (M1、M2、M3、およびそれらの可能なすべての組み合わせ) があります。各要素 (asu) (たとえば M1) が (rzs) (M1、M1M2、..) 内の要素 (たとえば M1) を検索する必要性。例: (asu) から M1 を取得し、(rzs) で重複 (contain) の検索を開始します。(rzs) に M1M2 が見つかりました。M1 が含まれています。その後、リストから両方の要素を削除する必要があります。No Idea For Name がこのコードの修正を手伝ってくれたことに感謝します。しかし、AbstractList.remove エラーのため、プログラムは常に失敗します。実装ロジックとコードのチューニングを手伝ってください!

Imports..........
        public class work{
        List<string> asu = Arrays.asList("M1","M1","M1","M3","M4","M5","M1","M1","M1","M4","M5","M5");
        List<string> rzs = Arrays.asList("M1","M2","M3","M4","M5",
        "M1M2","M1M3","M1M4","M1M5","M2M3","M2M4","M2M5","M3M4","M3M5","M4M5"
        ,"M1M2M3","M1M2M4","M1M2M5","M1M3M4","M1M3M4","M1M4M5","M2M4","M2M5");

        public static void main(String[] args) {
        work bebebe = new work();
        bebebe.mywork();
        }

        List<string> tmp1 = new ArrayList<string>();  
        List<string> tmp2 = new ArrayList<string>();  
           System.out.println(Arrays.deepToString(rzs));
           System.out.println(Arrays.deepToString(asu));
           for (string curr : asu){
             for (string currRzs : rzs){
               System.out.println("New iteration ");
               if (currRzs.contains(curr)) {
                  System.out.println("Element ("+curr+") in ASU =
                                    element ("+currRzs+") in RZS");
                  if(tmp1.contains(curr) == false)
                     tmp1.add(curr);

                  if(tmp2.contains(currRzs) == false)
                     tmp2.add(currRzs);
               }
              } 
            }

           for (string curr : tmp1){
              asu.remove(curr);
           }

           for (string currRzs : tmp2){
              rzs.remove(currRzs);
           }
4

5 に答える 5

2

foreach ループを使用してリストからアイテムを削除しないでください。クラシックを使用して要素を反復し、アイテムを削除するときは反復子を減らします。

于 2013-08-05T10:49:51.163 に答える
2

反復中に要素を安全に削除するには、Iterator.remove メソッドを使用します。

反復の進行中に、このメソッドを呼び出す以外の方法で基になるコレクションが変更された場合、反復子の動作は規定されていません。

Iterator<String> i = tmp1.iterator();
while (i.hasNext()) {
   i.next(); // must be called before remove
   i.remove();
}

また、次のように呼び出すだけで、すべてのコレクションを別のコレクションから簡単に削除できます。

asu.removeAll(tmp1);
于 2013-08-05T10:50:43.057 に答える
2

コレクションのremoveAll()またはretainAll()メソッドを利用するようにしてください。

例えば:

List<String> aList = new ArrayList<String>();
aList.add("a");
aList.add("b");
aList.add("c");
aList.add("d");
aList.add("e");

List<String> bList = new ArrayList<String>();
bList.add("b");
bList.add("e");
bList.add("d");

aList.removeAll(bList);

aListに残っている「a」および「c」要素を提供します

一方、retainAll() メソッドを使用しようとすると:

aList.retainAll(bList);

aListに残っている「b」、「d」、および「e」要素を提供します。

retainAll()指定されたコレクションの一部ではない、呼び出し元のコレクションのすべての要素を削除するために使用されます。

removeAll()コレクションのすべての要素を別のコレクションから削除するために使用されます。

したがって、それはすべてユースケースに依存します。

編集

いずれにせよ、条件付きで反復しながらこれらのコレクションからいくつかの要素を削除したい場合は、最初に を取得してから、そのメソッドをIterator<Type>呼び出す必要があります。remove()

お気に入り:

while(iterator.hasNext()){
    String str = iterator.next();

    if(str.equals('test')){
        iterator.remove();
    }
}
于 2013-08-05T10:57:49.550 に答える