Random 从ArrayList Java中删除随机元素

Random 从ArrayList Java中删除随机元素,random,arraylist,frequency,Random,Arraylist,Frequency,我自己试了几个小时后,我想我会寻求帮助的 我试图实现一个多字符集,并提供了某些操作,如添加、删除等。这些操作都很好,但我遇到了最后一个方法的问题,该方法假设返回一个基于频率的随机字符。我正在使用ArrayList来做所有的事情,除了最后一部分,它一直都非常出色。所以基本上,如果在我的多重集合中有50个z和50个e,那么它们被输出的机会应该是相等的。如果有4个a和2个b,则a应输出更多。我尝试使用Collections框架中提供的“frequency”方法,我有foreach循环中每个字符的频率,

我自己试了几个小时后,我想我会寻求帮助的

我试图实现一个多字符集,并提供了某些操作,如添加、删除等。这些操作都很好,但我遇到了最后一个方法的问题,该方法假设返回一个基于频率的随机字符。我正在使用ArrayList来做所有的事情,除了最后一部分,它一直都非常出色。所以基本上,如果在我的多重集合中有50个z和50个e,那么它们被输出的机会应该是相等的。如果有4个a和2个b,则a应输出更多。我尝试使用Collections框架中提供的“frequency”方法,我有foreach循环中每个字符的频率,但不知道如何适当地随机化。此外,我尝试使用Math.random并将范围设置为ArrayList中的字符,但结果不正确

如果有人能帮我,我会非常感激。在这一点上,我真的不知道还有什么可以尝试。下面是我的代码的完整类。共享整个文件可能更容易,这样您就可以看到我正在处理的内容

public class DenseMultiSetOfChar implements MultiSetOfChar{

    private ArrayList<Character> multi;

    public DenseMultiSetOfChar() {

        multi = new ArrayList<Character>();

    }

    public DenseMultiSetOfChar(char c) {

        multi = new ArrayList<Character>();

        multi.add(c);

    }

    @Override
    public int getCardinality() {

        return this.multi.size();
    }

    @Override
    public int getElementCount(char target) {
        int cardinalityCount = 0;

        // relating get element count and get cardinality.
        // sum of get element count for each char is == to cardn
        // of the set.

        for(char wantedCh : this.multi)
        {
            if(wantedCh == target)
            {
                cardinalityCount++;
            }
        }

        return cardinalityCount;
    }

    @Override
    public Set<Character> getElementSet() {

        Set<Character> withoutDuplicates = new HashSet<Character>();
        List<Character> copiedList = new ArrayList<Character>(Arrays.asList(new Character[this.multi.size()]));

        Collections.copy(copiedList, this.multi);

        for(char ch : copiedList)
        {
             withoutDuplicates.add(ch);
        }


        return withoutDuplicates;


    }

    @Override
    public void add(char item) {
        if(this.multi.size() < Integer.MAX_VALUE)
        {
                multi.add(item);

        }

    }

    @Override
    public boolean remove(char target) {

        boolean result = false;


        if(this.multi.contains(target))
        {

            this.multi.remove(this.multi.indexOf(target));
            result = true;
        }

        return result;

    }

    @Override
    public char randomUniformChoose() {
        //does not remove or change cardinality.
        //char that appears n times in multset with
        //cardinatlity m, prob of that ch being returnd
        //is n/m

        char result;
        int count = 0;
        int probability = 0;
        int index = 0;
        int randNum = 0;
        List<Character> copiedList = new ArrayList<Character>(Arrays.asList(new Character[this.multi.size()]));

        Collections.copy(copiedList, this.multi);

        Random rand = new Random();


        // use randomNum to remove based on index. If there are more
        // 50a's and 50'b, this it will give a fair opportunity of removing
        // either one.
        randNum = rand.nextInt(copiedList.size() - 0 +1) +0;
        for(char ch : copiedList)
        {
            count = Collections.frequency(copiedList, ch);


        }


        result = copiedList.remove(count);

        return result;
    }



}
公共类DenseMultiSetOfChar实现MultiSetOfChar{
私有数组列表多;
公共DensMultisetOfChar(){
multi=新的ArrayList();
}
公共DensMultisetOfChar(字符c){
multi=新的ArrayList();
增加(c);
}
@凌驾
public int getCardinality(){
返回此.multi.size();
}
@凌驾
public int getElementCount(字符目标){
int cardinalityCount=0;
//关联get元素计数和get基数。
//每个字符的get元素计数之和为==到cardn
//一套的。
for(char-wantedCh:this.multi)
{
如果(wantedCh==目标)
{
基数计数++;
}
}
返回基数计数;
}
@凌驾
公共集getElementSet(){
Set without duplicates=new HashSet();
List copiedList=newarraylist(Arrays.asList(新字符[this.multi.size()]);
Collections.copy(复制列表,this.multi);
用于(字符ch:copiedList)
{
无重复项。添加(ch);
}
无副本返回;
}
@凌驾
公共无效添加(字符项){
if(此.multi.size()
这是测试司机

    public class TestDenseMultiSetOfCharSimple {

    public static void main(String[] args) {
        MultiSetOfChar e = new DenseMultiSetOfChar();
        MultiSetOfChar s = new DenseMultiSetOfChar('a');

        System.out.println("Cardinality is " + s.getCardinality()
                + " (should be 1)");
        System.out.println("No. of a's is " + s.getElementCount('a')
                + " (should be 1)");
        System.out.println("No. of b's is " + s.getElementCount('b')
                + " (should be 0)");

        Set<Character> basis = s.getElementSet();
        System.out.println("Cardinality of basis set is " + basis.size()
                + " (should be 1)");

        s.add('a');
        s.add('a');
        s.add('b');

        System.out.println("Cardinality is " + s.getCardinality()
                + " (should be 4)");
        System.out.println("No. of a's is " + s.getElementCount('a')
                + " (should be 3)");
        System.out.println("No. of b's is " + s.getElementCount('b')
                + " (should be 1)");

        basis = s.getElementSet();
        System.out.println("Cardinality of basis set is " + basis.size()
                + " (should be 2)");

        boolean result = s.remove('c');
        System.out.println("Able to remove element c? " + result
                + " (should be false)");

        result = s.remove('a');
        System.out.println("Able to remove element a? " + result
                + " (should be true)");
        System.out.println("No. of a's is now " + s.getElementCount('a')
                + " (should be 2)");

        System.out
                .println("Random string (should have about twice as many a's as b's");
        for (int i = 0; i < 100; i++) {
            System.out.print(s.randomUniformChoose());
        }
        System.out.println();
    }

}
公共类TestDensMultisetOfCharsImple{
公共静态void main(字符串[]args){
MultiSetOfChar e=新密度MultiSetOfChar();
MultiSetOfChar s=新密度MultiSetOfChar('a');
System.out.println(“基数为”+s.getCardinality()
+“(应为1)”);
System.out.println(“a的数量为”+s.getElementCount('a'))
+“(应为1)”);
System.out.println(“b的数量为”+s.getElementCount('b'))
+“(应为0)”;
Set basis=s.getElementSet();
System.out.println(“基集的基数为”+basis.size()
+“(应为1)”);
s、 添加(“a”);
s、 添加(“a”);
s、 添加(‘b’);
System.out.println(“基数为”+s.getCardinality()
+“(应为4)”;
System.out.println(“a的数量为”+s.getElementCount('a'))
+“(应为3)”);
System.out.println(“b的数量为”+s.getElementCount('b'))
+“(应为1)”);
basis=s.getElementSet();
System.out.println(“基集的基数为”+basis.size()
+“(应为2)”;
布尔结果=s.remove('c');
System.out.println(“能够删除元素c?”+结果
+“(应为假)”;
结果=s.remove('a');
System.out.println(“是否能够删除元素a?”+结果
+“(应该是真实的)”;
System.out.println(“a的数量现在是”+s.getElementCount('a'))
+“(应为2)”;
系统输出
.println(“随机字符串(a的数量应该是b的两倍”);
对于(int i=0;i<100;i++){
系统输出打印(s.randomUniformChoose());
}
System.out.println();
}
}

您可以使用strait forward方法:

public char randomUniformChoose() {
    return this.multi.get((int)(Math.random() * this.multi.size()));
}

实际上,我也不确定这是否正确。我在另一个类中使用一个测试驱动程序,它执行for循环,调用方法randomUniformChoose 100次,并执行System.out.println,我得到的只是a。在执行时,multiset中当前的是:a,a,b。奇怪的是,我只运行了相同的te