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.