2013-08-06 21 views
-8
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 
import java.util.ArrayList; 
import com.google.common.collect.*; 
public class start { 
    public static void main(String[] args) { 
     start ex = new start(); 
     ex.doWork(); 

    } 
    public void doWork(){ 
     List<String> asu2 = new ArrayList<String>();    // Create and initialization Lists 
     List<String> rzs = new ArrayList<String>();    //  Order collection in descending order 
     List<String> same = new ArrayList<String>(); 
     for (int j=0;j<10;j++) { 
      for (int i=0;i<2;i++){ asu2.add("M1");} 
      asu2.add("M2"); 
      asu2.add("M3"); 
      asu2.add("M4"); 
      asu2.add("M5"); } 
     System.out.println("Asu size :"+asu2.size()); 
     List<String> asu = Ordering.natural().sortedCopy(asu2);  //  Order collection in direct order 
     Collections.reverse(asu); 
     for (int j=0;j<5;j++) { 
      for (int i=0;i<2;i++){ rzs.add("M1");} 
      rzs.add("M2"); 
      rzs.add("M3"); 
      rzs.add("M4"); 
      rzs.add("M5"); } 
     for (int j=0;j<3;j++) { 
      for (int i=0;i<2;i++){ rzs.add("M1M2");} 
      rzs.add("M2M3"); 
      rzs.add("M3M4"); 
      rzs.add("M4M5"); 
     } 
     for (int j=0;j<2;j++) { 
      for (int i=0;i<2;i++){ rzs.add("M1M2M3");} 
      rzs.add("M2M3M4"); 
      rzs.add("M3M4M5"); 
      rzs.add("M1M4M5"); 
      rzs.add("M1M2M5"); 
     } 
     System.out.println("Rzs size: "+rzs.size()); 


     for (int i=0;i<asu.size();i++){          // Поиск элементов типа M1<-->M1 
      for (int j=0;j<rzs.size();j++) { 
       if (asu.get(i).equals(rzs.get(j))) 
       { System.out.println("("+asu.get(i)+") ASU <--> ("+rzs.get(j)+") RZS "); 
        System.out.println("i+ "+i+" j: "+j); 
        same.add(asu.get(i)); 
        asu.remove(i); rzs.remove(j); 
       } 
      } 
     } 
     for (int i=0;i<asu.size();i++){          // Поиск элементов M1<-->M1M2 
      for (int j=0;j<rzs.size();j++) { 
       if ((asu.get(i).equals(rzs.get(j))) | rzs.get(j).contains(asu.get(i))) 
       { System.out.println("("+asu.get(i)+") ASU <--> ("+rzs.get(j)+") RZS "); 
        same.add(asu.get(i)); 
        asu.remove(i); rzs.remove(j); 
       } 
      } 
     } 
     System.out.println("Same size: " + same.size()); 
     System.out.println("Rzs size: "+rzs.size()); 
     for (int i=0;i<rzs.size();i++) 
      System.out.println(rzs.get(i)); 
     System.out.println("Asu size: "+asu.size()); 
     for (int i=0;i<asu.size();i++) 
      System.out.println(asu.get(i)); 




    } 
} 

結果:檢查代碼。不明白爲什麼邏輯行不通完全

Same size: 55 
Rzs size: 2 
M2M3 
M3M4 
Asu size: 5 
M4 
M2 
M1 
M1 
M1 

的邏輯是這樣的。如果((asu.get(i).equals(rzs.get(j))) | rzs.get(j).contains(asu.get(i))),它將從列表中刪除。 爲什麼元素仍然在ASU(例如M4),他們有一對(M3M4)? 對不起,代碼的結構。

+8

你在說什麼邏輯?這段代碼應該做什麼? – Philipp

+1

當您在調試器中遍歷代碼時,您會看到什麼?這就是它的目的。 –

+0

邏輯很簡單。如果在ASU中存在一個元素(例如M1),他可以在列表中找到RZS與他相同或由其組成的元素(如M1,M1M2)。也就是說,從ASU獲取元素,如果它對應於RZS中的M1 M1M2,將它們從列表中刪除,寫入M1的列表中SAME –

回答

2

不是在你的代碼很清楚,但是當您從您通過遍歷一個ArrayList中刪除元素,你不想增加索引,否則你會跳過元素,如:

ArrayList<...> list = ...; 

for (int i = 0; i < list.size();) { 
    if (shouldBeRemoved) 
     list.remove(i); 
    else 
     ++ i; 
} 

換句話說,如果您刪除索引i處的元素,則下一個元素現在位於i處,而不是i + 1.

由於您正在跳過元素,因此您可能會發現應該檢查的某些元素不是,因此仍然在列表中。

+0

感謝您的回覆,我更改了代碼以說明元素如何在列表中移動,現在一切都按照它應該的方式工作。非常感謝! –

相關問題