Random 从ArrayList Java中删除随机元素
我自己试了几个小时后,我想我会寻求帮助的 我试图实现一个多字符集,并提供了某些操作,如添加、删除等。这些操作都很好,但我遇到了最后一个方法的问题,该方法假设返回一个基于频率的随机字符。我正在使用ArrayList来做所有的事情,除了最后一部分,它一直都非常出色。所以基本上,如果在我的多重集合中有50个z和50个e,那么它们被输出的机会应该是相等的。如果有4个a和2个b,则a应输出更多。我尝试使用Collections框架中提供的“frequency”方法,我有foreach循环中每个字符的频率,但不知道如何适当地随机化。此外,我尝试使用Math.random并将范围设置为ArrayList中的字符,但结果不正确 如果有人能帮我,我会非常感激。在这一点上,我真的不知道还有什么可以尝试。下面是我的代码的完整类。共享整个文件可能更容易,这样您就可以看到我正在处理的内容Random 从ArrayList Java中删除随机元素,random,arraylist,frequency,Random,Arraylist,Frequency,我自己试了几个小时后,我想我会寻求帮助的 我试图实现一个多字符集,并提供了某些操作,如添加、删除等。这些操作都很好,但我遇到了最后一个方法的问题,该方法假设返回一个基于频率的随机字符。我正在使用ArrayList来做所有的事情,除了最后一部分,它一直都非常出色。所以基本上,如果在我的多重集合中有50个z和50个e,那么它们被输出的机会应该是相等的。如果有4个a和2个b,则a应输出更多。我尝试使用Collections框架中提供的“frequency”方法,我有foreach循环中每个字符的频率,
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