listas mezcladas

hola buenas quisiera pedir ayuda con esto que me pideron en clases Mezcla l1 y l2: mezcla los datos intercalados de 2 listas en una nueva lista en java. Desde ya gracias por su cooperacion entiendo algo java pero me falta algo de tiempo en estos momentos sigo intentando algun codigo.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de nomarlegnar

Se me ocurre...

public void mezclaListas(List<String> a, List<String> b) { //el metodo recibe dos listas a y b
        List<String> c = new ArrayList<String>();
        Iterator ia = a.iterator();//creamos el iterator que permite recorrer las listas a y b
        Iterator ib = b.iterator();
        while (ia.hasNext()) {//mientras contenga elementos hacer...
            String ea=(String)ia.next();//el metodo next() accede al objeto almacenado en la pocision de esa lista, lo parsea String
            c.add(ea); //y lo agrega a la una lista c
            while (ib.hasNext()){//mientras iterator b contenga elementos
                String eb=(String)ib.next();//extrae el elemento
                c.add(eb);// y lo agrega a la lista c
                ib.remove();// lo borra de la lista b
                break; // truena el while para volver a empezar sin el elemento anterior, borrando los elementos de la lista b para no repetirse.
            }
        } //termina el ciclo intercalando elemento a y elemento b en lista c
        Iterator ic=c.iterator(); //crea el iterator en la nueva lista
        while (ic.hasNext()){ // y la recorre para imprimirla.
            String ec=(String)ic.next();
            System.out.println(ec);
        }
    }

espero te sirva...

Imagen de ezamudio

eh

qué código tan enredado. Los Iterators son genéricos, no veo por qué no los usaste así, para evitar tanto cast.

El while interno debería ser un if y con eso ya no necesitas ese break.

En vez de recibir List<String>, podrías hacer el método genérico para que reciba listas de cualquier tipo.

El ArrayList lo deberías inicializar con el tamaño de ambas listas.

Y por último, tu método solamente funciona bien cuando la primera lista tiene tantos o más elementos que la segunda lista. Si la primera lista tiene N elementos y la segunda tiene M donde M>N, entonces la lista final no contendrá los últimos M-N elementos de la segunda lista.

Una revisión de lo escrito

Una revisión de lo escrito por nomarlegnar

import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;

class Merge {

    public static void main( String ... args ) {
        System.out.println(merge(
                Arrays.asList("a","a","a","a","a"),
                Arrays.asList("b","b","b","b","b","b","b","b","b","b")
            )
        );
    }
    public static <T> List<T> merge(List<T> a, List<T> b) {

        Iterator<T> bi = b.iterator();

        List<T> c = new ArrayList<T>(a.size() + b.size());
        for( T t : a ) {
            c.add( t );
            if ( bi.hasNext() ) {
                c.add( bi.next() );
            }
        }
        // finished with a append rest of b
        while ( bi.hasNext() ) {
            c.add(bi.next() );
        }
        return c;
    }
}

Justo estaba escribiendo el

Justo estaba escribiendo el ejemplo con la mismas observaciones de ezamudio... solo me faltó el tamaño inicial del arraylist ( ya actualicé el ejemplo ).

Imagen de nomarlegnar

Muy bien :D

Ezamudio, se nota que eres bueno en lo que haces, sigue así.
OscarRyz, que va campeón así se deberían hacer todas las correcciones.
A ambos, me queda agradecerles, ya que de este sitio es de donde eh ido aprendiendo el manejo de este lenguaje, cabe hacer mención que lo que tengo de antigüedad en esta comunidad es lo que tengo desarrollando, a todos nos sirve.