随机删除列表中的两个元素之一(一半时间删除1个项目,一半时间删除2个项目)

时间:2019-01-23 15:42:57

标签: java list

我有一个方法将采用列表。如果列表同时包含“ 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 :(得分:2)

改组列表可以解决问题。 尽管不能保证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 {

            }

答案 1 :(得分:0)

checkList方法采用list,检查两个项目是否都在列表中,如果它们都存在,则将其随机删除。如果listnull,则不执行任何操作。

    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;
    }

答案 2 :(得分:0)

您不能保证一个元素比另一个元素“在一半的时间内”被删除。但是,您可以做的是生成一个随机数01并根据该值删除其中一个元素。这实际上将模拟您想要的内容。

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");
    }
}

答案 3 :(得分:0)

如果您的意思是随机删除任何项目,那么您可以按照@prashantzombade的ans顺序对项目进行洗牌;如果您要计算要随机删除项目1和项目2的时间,则可以实现奇数偶数的逻辑你。具有静态变量。

  • 创建2个静态变量

  • 获取静态变量的计数

  • 一半时间(例如平均50%)实现逻辑

  • 获取随机号码

  • 如果否。甚至可以删除项目2,否则删除项目1

  • 如果随机数为偶数2,则将静态变量的no均增加1。

如果您想实施以下过程,请在评论ans时上传代码示例。

在这里,我正在检查删除项目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);

        }
    }

}