Listeyi belirli sayıda öğeye kısaltın


120

Bir listeyi (örneğin ilk 100 öğeyi) diğerlerini atarak (tek tek öğeleri yinelemeden) hangi yöntem keser?

Yanıtlar:


141

Kullanım List.subList:

import java.util.*;
import static java.lang.Math.min;

public class T {
  public static void main( String args[] ) {
    List<String> items = Arrays.asList("1");
    List<String> subItems = items.subList(0, min(items.size(), 2));

    // Output: [1]
    System.out.println( subItems );

    items = Arrays.asList("1", "2", "3");
    subItems = items.subList(0, min(items.size(), 2));

    // Output: [1, 2]
    System.out.println( subItems );
  }
}

subListÖğelerin bir görünümünü döndürdüğünü aklınızda bulundurmalısınız , bu nedenle listenin geri kalanının çöp toplama için uygun olmasını istiyorsanız, istediğiniz öğeleri yenisine kopyalamanız gerekir List:

List<String> subItems = new ArrayList<String>(items.subList(0, 2));

Liste belirtilen boyuttan daha kısaysa, bir sınır dışı istisna bekleyin . İstenen boyutun minimum değerini ve bitiş dizini olarak listenin geçerli boyutunu seçin.

Son olarak, ikinci bağımsız değişkenin istenen son dizinden bir fazla olması gerektiğini unutmayın.


1
soru tam olarak net olmamakla birlikte, Sam listenin sonunun silinmesini istiyor gibi geliyor. Bu nedenle cevabınız list.clear () içermelidir.
— mP.

Bunun, en iyi alternatif olan karim79'un çözümü kadar iyi performans göstermesi pek olası değildir - iyi performans gösterme şansı en yüksektir ve aynı zamanda en temiz koddur.
— Lawrence Dol

Kaldırılacak öğelerin sayısına bağlı olduğunu düşünüyorum (ve ayrıca Liste değişikliği destekliyorsa)
— Ben Lings

1
Java 8 bir seçenekseStream.limit , bence hile yapmalı ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
— Eran Medan

53
list.subList(100, list.size()).clear();

veya:

list.subList(0, 100);

3
İlk seçenek listeyi değiştirirken ikinci seçenek listeyi değiştirmez. Bu shoudlist = list.subList(0, 100)
— nessa.gp

3
Ayrıca unutmayınız subList(100, list.size()).clear()oluşturup eğer liste örneğin, berrak yöntem uygulanmaktadır varsa sadece olacak işi listile List<String> list = Arrays.asList(someString.split(","));(açık atacağım) UnsupportedOperationExceptionberi listsoyut olacaktır List.
— Gyuri

list.subList(n, list.size()).clear();
— Listenin

1
Bir listeyi kısaltmak için bir nesne oluşturmanız ne
— David Bradley

1
@DavidBradley True ama HotSpot bunu gerçekten optimize edebilir
— Stefan Reich

8

subListdiğer cevaplarda önerildiği gibi akla ilk gelen cevaptır. Ayrıca bir akış yaklaşımı öneririm .

source.stream().limit(10).collect(Collectors.toList()); // truncate to first 10 elements
source.stream().skip(2).limit(5).collect(Collectors.toList()); // discards the first 2 elements and takes the next 5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.