Memotong daftar menjadi sejumlah elemen

120

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

Sam
sumber

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.

Ben Lings
sumber
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);
karim79.dll
sumber
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
Ousmane D.
sumber