TransWikia.com

Como usar un listiterador para insertar ordenado en lInkedList

Stack Overflow en español Asked on November 4, 2021

package e17;

import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Random;

public class OrdenLink {

static  Random ran=new Random();

public static void main(String[] args) {
    // TODO Auto-generated method stub

    LinkedList<Integer> list=new LinkedList<Integer>();

    for(int i=0; i<25; i++) {
        
        Integer n=ran.nextInt(100);
        if(list.isEmpty())  list.add(n);
        
        
        else {
            ListIterator<Integer>it=list.listIterator();
            while(it.hasNext())
            if(it.next()>n) it.add(n); 
                    
        }
        
    }
}
}

Trato de insertar 25 números aleatorios de forma ordenada en Una LinkedList con un listiterator. Creo que el add del Listiterator insertar justo delante del next(); o después del previous();. Le he dado varias vueltas pero me lanza o NoSuchElementException o OutOfBounds. Alguien que arroje algo de luz a este oscuro camino¿

One Answer

Tenés dos problemas: 1- Si n el el mayor de la lista, no se inserta. 2- Cada vez que lees el next, el mismo cambia a la posición siguiente. Osea cuando comparás next()>n ya el "puntero de next" se movió para adelante alterando lo que hace el método add().

Para el punto 1, basta con poner una bandera que indique si se insertó el elemento o no, y luego fuera del while checkear la bandera y hacer el add si no se hizo antes.

Para el punto 2, una solución media hacky es ejecutar previous despues de leer el next() para volver el puntero una posición atrás. Y hacer un break del loop porque en una lista ordenada una vez que el elemento es menor a un elemento de la lista, también es menor a todos los que siguen.

import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Random;

public class HelloWorld{

     public static void main(String []args){
        Random ran = new Random();
        LinkedList<Integer> list = new LinkedList<Integer>();
    

        for(int i=0; i<25; i++) {
          Integer n = ran.nextInt(100);
          boolean added = false;
          System.out.println(n);

            ListIterator<Integer> it=list.listIterator();
            while(it.hasNext()) {
              if(it.next()>=n) {
                  it.previous();
                  it.add(n);
                  added = true;
                  break;
              }
            } 
            if (!added) { 
                list.add(n);
            }

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

Sugerencia: Evitá los if y while de una sola línea, te van a dar dolores de cabeza.

Answered by Juan on November 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP