在自己尝试了几个小时后,我想我会寻求帮助。
这是试图实现多组字符并提供某些操作,例如添加、删除等。这些都运行良好,但我在最后一种方法遇到问题,该方法假设基于频率返回随机字符。我正在使用 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();
}
}