2015-10-17 3 views
0

Извините за неуклюжий заголовок, английский не является моим первым языком.Неисправность доступа к вложенным массивам списков в Java

У меня возникли проблемы с управлением тем, как цикл вложенных циклов перемещается по списку списков.

Пример: У меня есть буквы, {A, B, C, D, E, F, G, H, I}. Они находятся в списке 2d следующим образом:

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'); 

Таким образом, каждая третья буква в алфавите входит в один список. У меня возникло несколько проблем, создающих цикл for, который будет проходить через список алфавитов и восстанавливать алфавит в правильном порядке. Любая помощь будет оценена по достоинству.

Какой будет лучшим решением, чтобы идти через и получить буквы в порядке, А затем В, то С, то Д.

Или спуститесь каждый список первых, получить то 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

Вы хотите поместить результат в список? –

ответ

0

Вам необходимо будет использовать оператор MOD и сделать арифметику на символе.

Вот возможное решение:

 for (int i = 0 ; i < 26 ; i++){ 
     alphabet.get(i%3).add((char) ('A' + i)); 
    } 
  • Вы на самом деле использовать MOD из i%3 идти систематически от 0 к 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++; 
     } 
    }