2015-08-01 3 views
1

Я пытаюсь написать метод, который получает список строк, и возвращает подмножества, содержащие n элементов. Вот мой код:Проблема с списками Java

import Pack; 
import java.util.List; 
import java.util.ArrayList; 

public class Testtt{ 
    public static void main(String[] args) { 
     List<String> input = new ArrayList<String>(); 
     input.add("a"); 
     input.add("b"); 
     input.add("c"); 
     input.add("d"); 
     input.add("e"); 

     System.out.println(subset(input, 3)); 
    } 

    public static List<List<String>> subset(List<String> inputlist, int n) { 
     List<List<String>> output = new ArrayList<List<String>>(); 
     List<String> temp = new ArrayList<String>(); 

     for (int i = 0; i < n; i++) { 
       temp = inputlist; 
       System.out.println("Temp = " +temp); 
       temp.remove(i); 
       output.add(temp); 
     } 

     return output; 
    } 
} 

Выход был содержащий только два элемента я решил отладки и это консольный вывод:

Temp = [a, b, c, d, e] 
Temp = [b, c, d, e] 
Temp = [b, d, e] 
[[b, d], [b, d], [b, d]] 

Я написал темп = список в начале цикла, но он остается прежним. Почему это происходит?

+1

Добро пожаловать в StackOverflow. Вопросы о проблемах в коде ** должны включать код **, а не ссылку на внешний сайт, такой как pastebin. Если код слишком длинный, вы должны разрезать его только на основную часть, которая показывает проблему. Пожалуйста, прочитайте [как спросить] (http://stackoverflow.com/help/how-to-ask) и [как создать MCVE] (http://stackoverflow.com/help/mcve). – RealSkeptic

+0

У вас есть вопросы о коде, который вы опубликовали? –

ответ

1
for (int i = 0; i < n; i++) { 
         temp = inputlist; 
         System.out.println("Temp = " +temp); 
         temp.remove(i); 
         output.add(temp); 
       } 

Здесь вы удаляете элемент из temp arraylist и добавляете его для вывода arraylist. На данный момент вы сохраняете ссылку на temp, и удаление с одного и того же временного arraylist приведет к выходу, который вы показали. В соответствии с вашей программой показанный результат является правильным. Если вы хотите, чтобы temp ouput должен был храниться в выходном arralist, просто создайте новый экземпляр списка массивов и сохраните его внутри вывода.

1

Я не могу понять ожидаемый результат здесь. Но есть две основные ошибки:

  1. вы измените список ввода
  2. в индексированной цикле удалить элемент из списка. это приведет к пропуску элементов через итерацию.

Именно поэтому этот код удаляет a и c и e, но не b и d.

Смежные вопросы