0

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

这是试图实现多组字符并提供某些操作,例如添加、删除等。这些都运行良好,但我在最后一种方法遇到问题,该方法假设基于频率返回随机字符。我正在使用 ArrayList 来做所有事情,除了最后一部分之外,它一直都很出色。所以基本上,如果我的多组中有 50 个 z 和 50 个 e,那么它们应该有相同的机会被输出。如果有 4 个 a 和 2 个 b,则应该输出更多。我尝试使用 Collections 框架中可用的“频率”方法,并且我在 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;
    }



}

这是测试驱动程序。

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

}
4

1 回答 1

1

您可以采用海峡前进方法:

public char randomUniformChoose() {
    return this.multi.get((int)(Math.random() * this.multi.size()));
}
于 2012-11-26T18:22:23.847 回答