【问题标题】:In java, how to replace a duplicate number in an ArrayList? [duplicate]在java中,如何替换ArrayList中的重复数字? [复制]
【发布时间】:2012-12-14 05:41:37
【问题描述】:

可能重复:
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;
}
}

我的教科书告诉我如何添加、删除和检索一个号码,但没有告诉我如何替换重复的号码。

谢谢。

【问题讨论】:

  • “替换”是什么意思?您是否想继续生成随机数,直到获得一个您还没有得到的随机数?
  • 重复问题中的重复:stackoverflow.com/questions/203984/…
  • 顺便说一句,MemoryGame.totalAnswers 总是小于 32?如果没有,您可能会遇到问题......
  • 我需要 8 个随机数来回
  • 对于一组合理大小的不同数字进行随机化,我会使用 [Fisher-Yates] 洗牌,然后选择第一个 N (可能高达整个输入大小)结果。我发现这种方法总体上更干净。 (Fisher-Yates shuffle 也可以以这样的方式实现,即数字作为流生成,而不需要完全计算。)

标签: java arraylist


【解决方案1】:

如果您不限于ArrayList,请改用HashSet&lt;Integer&gt;(或者更好的是LinkedHashSet)。 HashSet&lt;Integer&gt; 将保证您在集合中没有重复的值,LinkedHashSet&lt;Integer&gt; 将做同样的事情并保留项目的排序。

如果您坚持使用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,忘记最后一个sn-p。如果有人碰巧需要它,我会把它留在那里。您可以完全按照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("");
}

【讨论】:

  • 谢谢,到目前为止效果很好。
  • 使用更新的 cmets,我添加了另一个可行的解决方案,但没有使用 Set。干杯!
【解决方案2】:

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

randomNumberList.set(index, element);

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      从 0 到 31 的 8 个随机、不重复的数字

      您不需要任何实例变量、随机数生成代码或实例方法。
      你只需要这样:

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

      【讨论】:

      • 我试过这个方法,但不知何故我用这个方法得到了重复的数字。
      • 用这个代码完全不可能得到重复的数字,因为每个数字0-31只添加一次。你到底做了什么来“尝试”它?
      • 我用你的方法替换了我的 getRandomNumbers 方法,并删除了我在构造函数方法中的内容。但是,如果我在构造函数中使用它并通过 getRandomNumbers 方法返回值,它就可以正常工作。改组后有什么方法可以删除不使用的元素。 ei 洗牌后从 9-31 删除索引。我不会因为它删除它们,但我会这样认为,因为效率。感谢您的帮助。
      • 要“删除”使用过的,这样做:myList = list.subList(8, list.size())
      猜你喜欢
      • 2014-07-21
      • 2019-02-28
      • 2019-04-30
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多