Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

185
Vistas
Obtenga múltiples elementos de la lista por índices en tiempo constante

¿Cuál es la mejor manera de obtener múltiples elementos de una lista por sus índices en tiempo constante?

Si tengo una matriz:

 List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e");

Y tengo una lista/matriz con índices:

 List<Integer> indices = new ArrayList<>(); indices.add(0); indices.add(2); indices.add(3);

¿Cómo puedo obtener a, c, d en tiempo constante? Necesito algo como esto:

 List<String> filtered = list.filterByIndex(indices); filtered.stream().forEach(x -> System.out.print(x)); // output:"acd"

ACTUALIZACIÓN: La impresión de los artículos no tiene que ser en tiempo constante, por supuesto, solo la recolección de artículos. El código anterior de imprimir los elementos es solo para fines de demostración.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Yo sugiero:

 List<String> filtered = indices.stream() .map(list::get) .collect(Collectors.toList());

El resultado es el deseado:

 [a, c, d]

Suponiendo que la lista tiene acceso en tiempo constante (como lo tiene ArrayList ), esto se ejecuta en un tiempo que es lineal en el número de elementos solicitados (longitud de los indices ), pero no aumenta con la longitud de la lista list . Como se ha discutido en los comentarios, esto es lo mejor que podemos hacer.

Editar: Honestamente, no sé si el paso de recopilación anterior está en tiempo lineal en la cantidad de elementos recopilados. Posiblemente, las extensiones de la capacidad de la lista cuestan tiempo, y probablemente esto no requiera más que un tiempo lineal. Si necesitamos estar seguros, debemos recopilar de esta manera:

 .collect(Collectors.toCollection(() -> new ArrayList<>(indices.size())));

Esto asegura que se asigne una lista con la capacidad adecuada desde el principio para que no se necesiten extensiones.

over 4 years ago · Santiago Trujillo Denunciar

0

Para crear una lista:

 List<String> filtered = new ArrayList<>(); indices.forEach(index -> filtered.add(list.get(index))); System.out.println(filtered);

Solución de flujo y mapa

 List<String> filtered = indices.stream() .map(index -> list.get(index)) .collect(Collectors.toList());

Si solo necesita una cadena, puede hacerlo con StringBuilder

 StringBuilder sb = new StringBuffer(); indices.forEach(index -> sb.append(list.get(index))); System.out.println(sb.toString());
over 4 years ago · Santiago Trujillo Denunciar

0

Podrías hacer algo como esto:

 IntStream.range(0, list.size()) .boxed() .filter(indices::contains) .map(list::get) .forEach(System.out::println);
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda