在java中,如何替换ArrayList中的重复数字?

时间:2012-12-29 02:51:46

标签: java arraylist

  

可能重复:
  How do I remove repeated elements from ArrayList?

我想替换存储在ArrayList中的重复数字(如果有的话)。我认为随机变量的数字。这是班级。

import java.util.*;

public class RandomNumbers {
// instance variables
private ArrayList<Integer> randomNumberList = new ArrayList<Integer>(); 
private Random randomNums = new Random();

public RandomNumbers(){
    // generating and adding random numbers to the list
    for (int i=0; i<MemoryGame.totalAnswers; i++)
        randomNumberList.add(randomNums.nextInt(32));

    System.out.println("Numbers in the list: " + randomNumberList);
    System.out.println("");
}

public ArrayList<Integer> getRandomNumbers(){
    return randomNumberList;
}
}

我的学校书籍告诉我如何添加,删除和检索数字,而不是如何替换重复的数字。

感谢。

4 个答案:

答案 0 :(得分:2)

如果您不限于ArrayList,请使用HashSet<Integer>代替(或更好的是LinkedHashSet)。 HashSet<Integer>会保证您不会在集合中包含重复的值,LinkedHashSet<Integer>将执行相同的操作并保留项目的排序。

如果您坚持使用ArrayList,请执行以下操作:

public RandomNumbers(){
    HashSet<Integer> set = new HashSet<Integer>();

    // generating and adding random numbers to the list
    //for (int i=0; i<MemoryGame.totalAnswers; i++)
    while (set.size()<MemoryGame.totalAnswers)
        set.add(randomNums.nextInt(32));

    randomNumberList.addAll(set);  // dump the set in your ArrayList

    System.out.println("Numbers in the list: " + randomNumberList);
    System.out.println("");
}

此外,如果MemoryGame.totalAnswers == 32,那么您可以使用random list来加快此过程:

public RandomNumbers(){
    // generating and adding random numbers to the list
    for (int i=0; i<MemoryGame.totalAnswers; i++)
        randomNumberList.add(i);

    Collections.shuffle(randomNumberList);

    System.out.println("Numbers in the list: " + randomNumberList);
    System.out.println("");
}

** 更新 **

MemoryGame.totalAnswers == 8以来,请忘记最后一段。如果有人愿意,我会把它留在那里。您可以完全按照pst的建议跳过Set的使用:

public RandomNumbers(){
    // generating and adding random numbers to the list
    for (int i=0; i<32; i++)
        randomNumberList.add(i);

    Collections.shuffle(randomNumberList);

    // keep only the first ones we need
    randomNumberList.removeRange(MemoryGame.totalAnswers + 1, 32);

    System.out.println("Numbers in the list: " + randomNumberList);
    System.out.println("");
}

答案 1 :(得分:1)

要替换位置中的元素,请使用set()方法:

randomNumberList.set(index, element);

当然,首先找出哪些元素重复的逻辑取决于你;如果您的问题有重复的数字没有意义,最好使用Set数据结构(例如:HashSetLinkedHashSet,如果在迭代时保留插入顺序很重要you)并继续向集合添加随机元素,直到它具有所需的大小。

答案 2 :(得分:1)

如果最终目标是不同数字的随机列表,并且可能数字的范围不比所需结果的数量大很多,请考虑shuffle而不是替换重复项。

答案 3 :(得分:0)

如果你想要的只是你最后的评论

  

0个随机,非重复数字0-31

您不需要任何实例变量,随机数生成代码或实例方法 所有你需要的只是这个:

public static List<Integer> getRandomNumbers() {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < 32; i++)
        list.add(i);
    Collections.shuffle(list);
    return list.subList(0, 8);
}