Добавление значения в arraylist выполнение не прекращается

#java

Вопрос:

Я хочу построить алгоритм, учитывающий список целых чисел, отсортировать его.

Идея заключается в следующем: перебираем список целых чисел, первое значение попадает в новый список; следующее значение сравнивается с единственным существующим значением в новом списке и помещаем его до или после и так далее.

 import java.util.*;
import java.util.function.Supplier;
import java.util.ArrayList;
  
public class SortLists {
    
    public static void main(String args[])
    {
  
        // list [5,1,4,2,8]
        List<Integer> list = new ArrayList<Integer>();
        list.add(5);
        list.add(1);
        list.add(4);
        list.add(2);
        list.add(8);

        System.out.println("list : "   list.toString());
        
        // new empty list
        List<Integer> list2 = new ArrayList<Integer>();
        
        // iterate over the integer list
        for (int i = 0; i < list.size(); i  ){
        //int i=2;
        
            // *** 1st iteration - add the value to the list2
            
            if (i == 0){
                list2.add(list.get(i));
            } else {
                
                // *** in the next interations, compare with the existing values in list2
                for (int j = 0; j < list2.size(); j  ){

                    
                    // *** Note: this if is unecessary but I got an error with list2.get(j)
                    if (j==0){
                        // if the value from list is lower than the only value in list2, put in index 0
                        if (list.get(i) < list2.get(0) ) {
                             list2.add(j,list.get(i));
                        } 
                        
                    }else{
                         
                        if (list.get(i) < list2.get(j) ) {
                             //list2.add(j,list.get(i)); // GIVES ERROR!
                             System.out.println("index " j " value " list.get(i));
                             
                        } else {
                            //list2.add(list.get(i)); //GIVES ERROR!
                            System.out.println("else: index " j " value " list.get(i));
                        }
                    }
                }
            }
        }
        //list2.add(1,4); // no error if add manually here
        System.out.println("list2 : "   list2.toString());
        
    }
}
 

5 и 1 правильно вставлены в список 2.

Два других list2.add , если я их раскомментирую, выполнение не остановится.

Комментарии:

1. поскольку i или j всегда будут меньше, чем list2.size() или list.size (), это похоже на то, что вы добавляете значение в эти списки, и в то же время указатель индекса перемещается следующим свободным пространством, а поскольку arraylist динамичен, i и j никогда не будут соответствовать размеру этих списков. просто для проверки попробуйте запустить код с такими условиями, как i < 10(примерное значение) и j

2. Вам нужно выйти из внутреннего цикла после добавления значения в list2.

3. Вызов size() из for инструкции и вызов «list.get(i)» в цикле очень неэффективны.

Ответ №1:

казнь не прекращается

Вы попадаете в бесконечный цикл, потому что во внутреннем for цикле вы добавляете элементы во второй список во время итерации по списку.

Кроме того, вы излишне усложняете ситуацию. Просто сохраните первый индекс, для которого list.get(i) < list2.get(j) это верно. Если такой индекс существует, добавьте i-й элемент из списка один в список два по этому индексу. В противном случае добавьте i-й элемент из первого списка в конец второго списка.

 public static void main(String[] args) {
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(5);
    list.add(1);
    list.add(4);
    list.add(2);
    list.add(8);

    System.out.println("list : "   list.toString());

    List<Integer> list2 = new ArrayList<Integer>();
    
    list2.add(list.get(0));
    
    for (int i = 1; i < list.size(); i  ){
        int index = list2.size();
        for(int j = 0; j < list2.size(); j  ){
            if (list.get(i) < list2.get(j)){
                index = j;
                break;
            }
        }
        list2.add(index,list.get(i));
    }

    System.out.println(list);
    System.out.println(list2);
}
 

Ответ №2:

Добавьте j после прокомментированного кода, который выдает ошибку, так как вы увеличиваете размер списка на единицу. В противном случае это бесконечный цикл.