2015-10-17 84 views
0

對於笨重的標題,英語不是我的第一語言。在Java中訪問嵌套數組列表時遇到問題

我有問題控制嵌套for循環是如何繞過列表的列表。

例如:我有字母{A,B,C,D,E,F,G,H,I}。他們在這樣的二維列表中:

List<List<Character>> alphabet = new ArrayList<List<Character>>(3); 
alphabet.get(0).add('A'); 
alphabet.get(1).add('B'); 
alphabet.get(2).add('C'); 
alphabet.get(0).add('D'); 
alphabet.get(1).add('E'); 
alphabet.get(2).add('F'); 
alphabet.get(0).add('G'); 
alphabet.get(1).add('H'); 
alphabet.get(2).add('I'); 

因此,字母表中的每個第三個字母都在同一個列表中。 我有一些問題,使循環將通過字母表列表,並按正確的順序重建字母表。任何幫助,將不勝感激。

這將是最好的解決方案,跨越去弄的字母按順序A然後B然後C,然後D.

還是第一次下井每個列表,弄了那麼d則G,當我移動到下一個列表,然後插入所需的位置?

謝謝

//改寫

試想3個列表,在列表中。這3個列表代表了字母列。

alphabet = [[a, d, g, j], [b, e, h], [c, f, i]] 

什麼是通過嵌套列表循環的最佳方式,並重建字母按正確的順序?

然後我將結果放入一個字符串並寫入一個文件。

這是我的for循環。

for(int k = 0, i = 0; k < decryptedtextColumns.get(i).size(); k++) 
{ 
    for(i = 0; i < decryptedtextColumns.size(); i++) 
    { 
     if(k <= decryptedtextColumns.get(i).size()) 
     { 
      Character letter = decryptedtextColumns.get(i).get(k); 
      decryptedtext.add(letter); 
     } 
    } 
} 
+0

對我不太清楚。你能改說嗎? –

+0

我盡力重寫@sᴜʀᴇsʜᴀᴛᴛᴀ –

+0

你想把結果放在列表中嗎? – 2015-10-17 16:09:04

回答

0

您必須使用MOD運算符並對char進行運算。

這裏是一個可能的解決方案:

 for (int i = 0 ; i < 26 ; i++){ 
     alphabet.get(i%3).add((char) ('A' + i)); 
    } 
  • 你實際使用i%3MOD0系統去2每一次加char'A' + i值你循環。
0

您基本上只需要mergesort算法中的合併函數的多維形式。

請查看以下代碼IdeOne

class Ideone 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     List<List<Character>> alphabet = new ArrayList<List<Character>>(3); 
     List<Character> first = new ArrayList<Character>(); 
     first.add('a'); 
     first.add('d'); 
     first.add('g'); 
     first.add('i'); 
     List<Character> second = new ArrayList<Character>(); 
     second.add('b'); 
     second.add('e'); 
     second.add('h'); 
     List<Character> third = new ArrayList<Character>(); 
     third.add('c'); 
     third.add('f'); 
     third.add('j'); 
     alphabet.add(first); 
     alphabet.add(second); 
     alphabet.add(third); 

     List<Character> mergedSoFar = new ArrayList<Character>(); 
     for(int i = 0; i < alphabet.size(); ++i) { 
      List<Character> sortedLetters = alphabet.get(i); 
      mergedSoFar = merge(mergedSoFar, sortedLetters); 
     } 
     System.out.println(mergedSoFar); 
    } 

    private static List<Character> merge(List<Character> left, List<Character> right) { 
     List<Character> merged = new ArrayList<Character>(left.size() + right.size()); 
     int i = 0; 
     int j = 0; 
     while (i < left.size() && j < right.size()) { 
      char leftLetter = left.get(i); 
      char rightLetter = right.get(j); 
      int comparison = Character.compare(leftLetter, rightLetter); 
      if (comparison < 0) { 
       merged.add(leftLetter); 
       ++i; 
      } else if (comparison > 0) { 
       merged.add(rightLetter); 
       ++j; 
      } else { 
       // letters are same, add both 
       merged.add(leftLetter); 
       ++i; 
       merged.add(rightLetter); 
       ++j; 
      } 
     } 
     while(i < left.size()) { 
      merged.add(left.get(i)); 
      ++i; 
     } 
     while(j < right.size()) { 
      merged.add(right.get(j)); 
      ++j; 
     } 
     return merged; 
    } 
} 
1

的Java 8有一個簡單的和短期的方式來做到這一點。

List<Character> sortedAlphabets= alphabet.stream().flatMap(list->list.stream()).sorted(). 
       collect(Collectors.toList()); 

產生輸出

[A, B, C, D, E, F, G, H, I] 
0

設法得到它的工作。作爲一個非常具體的事情,我不知道它會有多大的用處,但一般情況是如上所述。

for(int k = 0, i = 0; k < decryptedtextColumns.get(i%5).size(); k++) 
    {   
     i = 0; 
     while(i < decryptedtextColumns.size() && k < decryptedtextColumns.get(i).size()) 
     { 
      if(k <= decryptedtextColumns.get(i).size()) 
      { 
       Character letter = decryptedtextColumns.get(i).get(k); 
       decryptedtext.add(letter); 
      } 
      i++; 
     } 
    }