случайным образом удалить один из двух элементов в списке (половина времени удаляет 1 элемент и половина времени удаляет 2 элемента) - PullRequest
0 голосов
/ 23 января 2019

У меня есть метод, который будет принимать список. Если список содержит и "item1", и "item2", он должен удалить один из два, но мне нужно сделать это случайным образом (то есть половину времени, удаляя «item1» и половину времени, удаляя «item2»). В противном случае он должен оставить список без изменений. Если вы передадите null, метод ничего не должен делать.

У меня есть метод:

public static void removeItem(List<String> items) {
    if (items.contains("item1") && 
            items.contains("item2")) 
{

        Random random = new Random();
        int randomIndex =  random.nextInt(items.size());
        items.remove(randomIndex);

    } else if (items.isEmpty()) {

    } else {

    }
}

Я не уверен, как заставить его убирать половину времени. Любая помощь оценивается

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Если вы имеете в виду, случайным образом удалить любой элемент, то вы можете перетасовать элементы в соответствии с ответами @prashantzombade, и если вы хотите посчитать время, когда вы удаляете элемент 1 и элемент 2 случайным образом, вы можете реализовать логику нечетного четного государственное страхование Со статической переменной.

  • сделать 2 статические переменные

  • получить количество статических переменных

  • реализовать логику на половину времени (например, 50%)

  • случайный номер нет

  • , если нет. Это даже тогда удалить пункт 2, иначе пункт 1

  • увеличить статическую переменную, даже если нет, на 1, если случайное число является еще переменной 2

Если вы хотите реализовать следующий процесс, прокомментируйте, и я выложу пример кода.

Здесь я проверяю точное количество элементов удаления 1 и пункта 2 (точная половина времени)

import java.util.Random;
import java.util.*;

class hello2
{
    static int evn=0;

    public static void main(String[] args) {

        List<String> list = new ArrayList<String>();
        list.add("item1");
        list.add("item2");

        int randomNumber=0;

        //list = checkList(list);
        //skip if null

        if(list!=null){


        //find index of items
        int index1 = list.indexOf("item1");
        int index2 = list.indexOf("item2");

        //if one item doesn't exist in list, its index will be -1
        if(index1 >= 0 && index2 >= 0){

            //get random number between 1 and 2
            Random random = new Random();
            randomNumber = random.nextInt(2) + 1;

            if((randomNumber %2)== 0){
                //remove item1              
                if(evn==1) //if last time item 2 deleted
                {
                    list.remove(index2);                    
                    //System.out.println(list+" Static var="+evn+" Random no: "+randomNumber%2);
                    evn=0;

                }
                //else{System.out.println(list+" Static var="+evn+" Random no: "+randomNumber%2);}
            }else{
                //remove item2
                if(evn==0) //if last time item 1 deleted
                {
                    list.remove(index1);

                    //System.out.println(list+" Static var="+evn+" Random no: "+randomNumber%2);
                    evn=1;                  
                }
                //else{System.out.println(list+" Static var="+evn+" Random no: "+randomNumber%2);}
            }
        }

        System.out.println(list);

        }
    }

}
0 голосов
/ 23 января 2019

Этот метод checkList принимает list, проверяет, есть ли оба элемента в списке, и удаляет один из них случайным образом, если они оба существуют. Ничего не делает, если list равно null.

    public static void main(String[] args) {

        List<String> list = new ArrayList<String>();
        list.add("item1");
        list.add("item2");

        list = checkList(list);
    }

    private static List<String> checkList(List<String> list){

        //skip if null
        if(list == null){
            return list;
        }

        //find index of items
        int index1 = list.indexOf("item1");
        int index2 = list.indexOf("item2");

        //if one item doesn't exist in list, its index will be -1
        if(index1 >= 0 && index2 >= 0){

            //get random number between 1 and 2
            Random random = new Random();
            int randomNumber = random.nextInt(2) + 1;

            if(randomNumber == 1){
                //remove item1
                list.remove(index1);
            }else{
                //remove item2
                list.remove(index2);
            }
        }

        return list;
    }
0 голосов
/ 23 января 2019

Вы не можете гарантировать, что один элемент удален "наполовину" по сравнению с другим. Однако вы можете сгенерировать случайное число 0 или 1 и удалить один из элементов на основе этого. Это по сути будет имитировать то, что вы хотите.

public static void removeItem(List<String> items) {
    if (items == null || items.isEmpty()) {
        return;
    }
    if (!items.contains("item1") || !items.contains("item2")) {
        return;
    }

    int randomNumber = ThreadLocalRandom.current().nextInt(0, 2);
    if (randomNumber == 0) {
        items.remove("item1");
    } else {
        items.remove("item2");
    }
}
0 голосов
/ 23 января 2019

Перемешивание списка может помочь.Хотя нет гарантии по пункту half the time.
Вы можете иметь любое количество элементов в списке.

Не может быть оптимальным решением, но я могу предложить это:

    public static void main(String[] args) {

            List<String> list = new ArrayList<String>();
            list.add("item2");
            list.add("item3");
            list.add("item1");
            list.add("item4");

            System.out.println("Before : " + list);
            removeItem(list);
            System.out.println("After : " + list);
        }

        public static void removeItem(List<String> items) {

            if (items == null) {

                // Handle the null list
                System.out.println("List is null");
            } else if (items.contains("item1") && items.contains("item2")) {

                //Shuffle the list, randomize the items and then remove `item1` or `item2` which ever appears earliest.
                Collections.shuffle(items);
// Modern approach
items.stream().filter(i->i.equals("item1") || i.equals("item2")).findAny().ifPresent(i->items.remove(i));
/*
                int removeIndex = 0;
                for (int i = 0; i < items.size(); i++) {
                    if (items.get(i).equals("item1") || items.get(i).equals("item2")) {
                        removeIndex = i;
                        break;
                    }
                }

                items.remove(removeIndex);
 */   
            } else if (items.isEmpty()) {

            } else {

            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...