Memotong daftar menjadi sejumlah elemen


120

Metode apa yang memotong daftar - misalnya ke 100 elemen pertama - membuang yang lain (tanpa mengulang melalui elemen individual)?

Jawaban:


141

Penggunaan 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 );
  }
}

Anda harus ingat bahwa subListmengembalikan tampilan item, jadi jika Anda ingin sisa daftar memenuhi syarat untuk pengumpulan sampah, Anda harus menyalin item yang Anda inginkan ke yang baru List:

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

Jika daftar lebih pendek dari ukuran yang ditentukan, perkirakan pengecualian di luar batas . Pilih nilai minimum dari ukuran yang diinginkan dan ukuran daftar saat ini sebagai indeks akhir.

Terakhir, perhatikan bahwa argumen kedua harus lebih dari satu dari indeks yang diinginkan terakhir.


1
sementara pertanyaannya tidak terlalu jelas, sepertinya sam menginginkan akhir dari daftar dihapus. Oleh karena itu, jawaban Anda harus menyertakan list.clear ().
mP.

Ini tidak mungkin berkinerja sebaik solusi karim79, yang merupakan alternatif terbaik - ini memiliki peluang terbaik untuk berkinerja baik dan merupakan kode terbersih juga.
Lawrence Dol

Saya pikir itu tergantung pada jumlah elemen yang akan dihapus (dan juga jika Daftar mendukung modifikasi)
Ben Lings

1
Jika Java 8 adalah opsi, saya pikir Stream.limitharus melakukan trik ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
Eran Medan

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

atau:

list.subList(0, 100);

3
Opsi pertama mengubah daftar sedangkan opsi kedua tidak. Seharusnyalist = list.subList(0, 100)
nessa.gp

3
Perhatikan juga bahwa subList(100, list.size()).clear()hanya akan berfungsi jika daftar menerapkan metode jelasnya, misalnya jika Anda membuat listdengan List<String> list = Arrays.asList(someString.split(","));clear () akan membuang UnsupportedOperationExceptionkarena listakan menjadi abstrak List.
Gyuri

Jika Anda ingin menyimpan n elemen awal Daftar, itu haruslist.subList(n, list.size()).clear();
Chaklader Asfak Arefe

1
Sayang sekali Anda harus membuat objek hanya untuk mempersingkat daftar
David Bradley

1
@DavidBradley Benar tetapi HotSpot sebenarnya dapat mengoptimalkan ini jauh
Stefan Reich

8

subList, seperti yang disarankan dalam jawaban lain, adalah yang pertama muncul di pikiran. Saya juga menyarankan pendekatan aliran .

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.