ตัดทอนรายการเป็นจำนวนองค์ประกอบที่กำหนด


120

วิธีใดที่ตัดทอนรายการเช่น 100 องค์ประกอบแรก - ทิ้งรายการอื่น ๆ (โดยไม่ต้องวนซ้ำผ่านแต่ละองค์ประกอบ)

คำตอบ:


141

ใช้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จะส่งคืนมุมมองของรายการดังนั้นหากคุณต้องการให้รายการที่เหลือมีสิทธิ์ได้รับการรวบรวมขยะคุณควรคัดลอกรายการที่คุณต้องการไปยังรายการใหม่List:

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

หากรายการสั้นกว่าขนาดที่ระบุคาดว่าจะอยู่นอกขอบเขต ข้อยกเว้น เลือกค่าต่ำสุดของขนาดที่ต้องการและขนาดปัจจุบันของรายการเป็นดัชนีสิ้นสุด

สุดท้ายโปรดทราบว่าอาร์กิวเมนต์ที่สองควรเป็นมากกว่าดัชนีสุดท้ายที่ต้องการ


1
แม้ว่าคำถามจะไม่ชัดเจนนัก แต่ดูเหมือนว่าแซมต้องการให้ส่วนท้ายของรายการถูกลบ ดังนั้นคำตอบของคุณควรมี list.clear ()
mP.

วิธีนี้ไม่น่าจะทำงานได้ดีเท่ากับโซลูชันของ karim79 ซึ่งเป็นทางเลือกที่ดีที่สุด - มีโอกาสที่ดีที่สุดในการทำงานได้ดีและเป็นรหัสที่สะอาดที่สุดเช่นกัน
Lawrence Dol

ฉันคิดว่ามันขึ้นอยู่กับจำนวนองค์ประกอบที่จะลบออก (และถ้ารายการรองรับการแก้ไข)
Ben Lings

1
ถ้า Java 8 เป็นตัวเลือกฉันคิดว่าStream.limitควรทำเคล็ดลับ ( docs.oracle.com/javase/8/docs/api/java/util/stream/… )
Eran Medan

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

หรือ:

list.subList(0, 100);

3
ตัวเลือกแรกแก้ไขรายการในขณะที่ตัวเลือกที่สองไม่แก้ไข เป็นวันที่list = list.subList(0, 100)
nessa.gp

3
นอกจากนี้ทราบว่าsubList(100, list.size()).clear()การทำงานจะมีเพียงถ้ารายการมีวิธีการดำเนินการที่ชัดเจนเช่นถ้าคุณสร้างlistโดยList<String> list = Arrays.asList(someString.split(","));ชัดเจน () จะโยนUnsupportedOperationExceptionตั้งแต่จะเป็นนามธรรมlist List
Gyuri

หากคุณต้องการเก็บองค์ประกอบ n เริ่มต้นของรายการไว้ควรเป็นlist.subList(n, list.size()).clear();
Chaklader Asfak Arefe

1
ความอัปยศคุณต้องสร้างวัตถุเพื่อย่อรายการ
David Bradley

1
@DavidBradley True แต่ HotSpot อาจเพิ่มประสิทธิภาพให้ดีที่สุด
Stefan Reich

8

subListตามที่แนะนำไว้ในคำตอบอื่น ๆ เป็นสิ่งแรกที่ควรคำนึงถึง ฉันขอแนะนำวิธีการสตรีมด้วย

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.