Удаление случайных элементов из ArrayList Java

0

после нескольких часов попыток этого сам я решил, что попрошу о помощи.

Я пытаюсь реализовать множество наборов символов и предоставляет определенные операции, такие как добавление, удаление и т.д. Все они работают хорошо, но у меня возникают проблемы с этим последним методом, который, как предполагается, возвращает случайную базу символов на частоте. Я использую ArrayList, чтобы делать все, и он отлично работает, кроме этой последней части. Таким образом, в основном, если в моем мульти-наборе есть 50 z и 50 e, тогда они должны иметь равные шансы на выход. Если есть 4 a и 2 ba, выдается больше. Я попытался использовать "частотный" метод, доступный из структуры 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 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 is " + s.getElementCount('a')
+ " (should be 1)");
System.out.println("No. of b 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 is " + s.getElementCount('a')
+ " (should be 3)");
System.out.println("No. of b 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 is now " + s.getElementCount('a')
+ " (should be 2)");

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

}

спросил(а) 2012-11-26T21:15:00+04:00 6 лет, 11 месяцев назад
1
1 ответ
1

Вы можете пойти прямым способом:

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

ответил(а) 2012-11-26T21:22:00+04:00 6 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема