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.