Sunday, January 10, 2021

Get Random Item/Element From a List trong java

1. Giới thiệu

Chọn một phần tử Danh sách ngẫu nhiên là một thao tác rất cơ bản nhưng không quá rõ ràng để thực hiện. Trong bài viết này, chúng tôi sẽ chỉ ra cách hiệu quả nhất để thực hiện việc này trong các ngữ cảnh khác nhau.

2. Picking a Random Item/Items

Để lấy một mục ngẫu nhiên từ một đối tượng Danh sách, bạn cần tạo một số chỉ mục ngẫu nhiên và sau đó tìm nạp một mục theo số chỉ mục đã tạo này bằng phương thức List.get ().

Get Random Item/Element From a List trong java

2.1. Single Random Item

Để chọn một chỉ mục ngẫu nhiên, bạn có thể sử dụng phương thức Random.nextInt (int bind):

public void givenList_shouldReturnARandomElement() {

    List<Integer> givenList = Arrays.asList(1, 2, 3);

    Random rand = new Random();

    int randomElement = givenList.get(rand.nextInt(givenList.size()));

}

Thay vì lớp Ngẫu nhiên, bạn luôn có thể sử dụng phương thức tĩnh Math.random () và nhân nó với kích thước danh sách (Math.random () tạo ra Giá trị ngẫu nhiên kép giữa 0 (bao gồm) và 1 (độc quyền), vì vậy hãy nhớ chuyển nó thành int sau khi nhân).

2.2. Select Random Index in Multithread Environment

Khi viết các ứng dụng đa luồng bằng cá thể lớp Ngẫu nhiên, có thể dẫn đến việc chọn cùng một giá trị cho mọi quy trình truy cập vào cá thể này. Chúng ta luôn có thể tạo một phiên bản mới cho mỗi luồng bằng cách sử dụng lớp ThreadLocalRandom chuyên dụng:

int randomElementIndex

  = ThreadLocalRandom.current().nextInt(listSize) % givenList.size();

2.3. Select Random Items With Repetitions

Đôi khi bạn có thể muốn chọn một vài phần tử từ danh sách. Nó khá đơn giản:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsRepeat() {

    Random rand = new Random();

    List<String> givenList = Arrays.asList("one", "two", "three", "four");


    int numberOfElements = 2;


    for (int i = 0; i < numberOfElements; i++) {

        int randomIndex = rand.nextInt(givenList.size());

        String randomElement = givenList.get(randomIndex);

    }

}

2.4. Select Random Items Without Repetitions

Tại đây, bạn cần đảm bảo rằng phần tử đó được xóa khỏi danh sách sau khi chọn:

public void givenList_whenNumberElementsChosen_shouldReturnRandomElementsNoRepeat() {

    Random rand = new Random();

    List<String> givenList = Lists.newArrayList("one", "two", "three", "four");


    int numberOfElements = 2;


    for (int i = 0; i < numberOfElements; i++) {

        int randomIndex = rand.nextInt(givenList.size());

        String randomElement = givenList.get(randomIndex);

        givenList.remove(randomIndex);

    }

}

2.5. Select Random Series

Trong trường hợp bạn muốn lấy chuỗi phần tử ngẫu nhiên, lớp Collections utils có thể hữu ích:

public void givenList_whenSeriesLengthChosen_shouldReturnRandomSeries() {

    List<Integer> givenList = Lists.newArrayList(1, 2, 3, 4, 5, 6);

    Collections.shuffle(givenList);


    int randomSeriesLength = 3;


    List<Integer> randomSeries = givenList.subList(0, randomSeriesLength);

}

3. Kết luận

Trong bài viết này, chúng tôi đã khám phá cách hiệu quả nhất để tìm nạp các phần tử ngẫu nhiên từ một đối tượng Danh sách cho các tình huống khác nhau.

Các ví dụ về mã có thể được tìm thấy trên GitHub.

No comments:

Post a Comment