Java嵌套循环防止重复

Java嵌套循环防止重复,java,loops,Java,Loops,这个物体是一包口香糖。每一种口香糖都是独一无二的。我们准备了一个能装12颗牙龈的包。我们用新的口香糖填充包装。我们必须检查包装,看看这种口香糖是否已经放进包装里了。包装中的每种口香糖都必须是独一无二的 public PackOfGum() { pack = new Gum[12]; // Successfully populate pack with gum for (int i=0; i<12; i++) { pack[i] = new Gum(); //

这个物体是一包口香糖。每一种口香糖都是独一无二的。我们准备了一个能装12颗牙龈的包。我们用新的口香糖填充包装。我们必须检查包装,看看这种口香糖是否已经放进包装里了。包装中的每种口香糖都必须是独一无二的

public PackOfGum()
{
  pack = new Gum[12];
  // Successfully populate pack with gum
  for (int i=0; i<12; i++) {
    pack[i] = new Gum();


    // Failure preventing duplicate gums. Idea is to look in the pack
    // at all of the gums that came before this one, and see if this one
    // matches any of them. While yes and it is a duplicate, then choose
    // a new gum.
    for (j=0; j<i; j++) {
      while (pack[i] == pack[j]) {
        pack[i] = new Gum();
      }
    }
  }
}

我没有正确地检查所有以前的牙龈,并将它们与当前的牙龈进行比较。这应该如何正确完成?

您需要在Gum类中提供自己的equals实现

如果您的对象有可能在哈希表中使用,您还应该重写哈希代码。一个合理的实现是将对象字段的哈希代码与以下内容结合起来:

@Override
public int hashCode() 
{
    int hashCode = 1;
    hashCode = hashCode * 37 + this.field1.hashCode();
    hashCode = hashCode * 37 + this.field2.hashCode();
    return hashCode;
}

有关实现哈希函数的更多详细信息,请参见。您的问题中缺少了许多内容。首先,因为你没有给我们上口香糖课,我不知道每个新口香糖是如何创造出一种独特的口香糖的。Gum是否有某种风味实例变量被初始化为随机风味?也许吧,但你还没有给我们这些信息。另外,正如另一个答案所指出的,使用==来比较牙龈是行不通的。假设每个Gum都有一个味道,您将需要提供一个equals方法来比较味道字段是否相等,以及一个hashCode函数,该函数为具有相同味道的任何Gum对象返回相同的哈希值

我最想指出的问题是循环逻辑中的缺陷。你正在浏览现有的Gum对象数组,每当你发现一个重复的,你就创建一个新的Gum。那不能完成任务。假设你的数组由口味A、B、C、D、E组成。假设你的新口香糖生成了一个带有口味C的口香糖。你遍历数组,发现它与pack[2]匹配。所以你生成了另一个口香糖,比如说你的随机口香糖生成器生成了一个味道为B的口香糖。现在你的循环找不到它,因为你仍然在数组中前进,你只会看到D和E。所以你的包中会有一个重复的口香糖

那你是做什么的?一种选择是,无论何时发现重复项,都会生成一个新的Gum,然后在数组的开头重新开始。这是一种相当缓慢的做事方式,但它会奏效。一些更好的选择:

保留一套包装中已有的口香糖。现在,不必通过数组查看一个Gum是否是重复的,只需查看集合中是否包含它。如果您使用哈希集,您将能够在固定时间内执行此测试,而不是在数组中搜索。如果您使用HashSet,您肯定需要一个工作的hashCode函数

保留一系列尚未使用的口香糖口味。如果你从12种口味开始,那么第一种新口香糖将使用0到11的随机数,第二种口香糖将使用0到10的随机数,第三种口香糖将使用0到9的随机数,依此类推。每次,您都将使用数组和随机数来选择正确的味道,然后进行交换以将该味道移动到数组的末尾。例如,如果数组从A,B,C,D,E,F,G,H,I,J,K,L开始,你的随机数是4,这就是味道E,你用L交换它,你的数组是A,B,C,D,L,F,G,H,I,J,K,E。下一个随机数只从0到11,所以它不会选择E。不管它选择什么,你用K交换它。依此类推


我不确定我是否正确理解了你的问题。但是,如果您只想存储枪的非重复集合,那么可以使用java.util.Set来存储它。您需要在Gum类中实现equals方法来定义相等条件。问题:如何比较Gum对象?使用它的内存地址或它的值?这种口香糖的定义是什么?您现在正在比较两个Gum引用是否引用同一个Gum对象实例。假设您正在为数组中的每个元素创建一个新的Gum实例,它将始终是不同的。@Hector实现hashCode而不实现equals不会破坏契约。虽然这有点傻。
@Override
public int hashCode() 
{
    int hashCode = 1;
    hashCode = hashCode * 37 + this.field1.hashCode();
    hashCode = hashCode * 37 + this.field2.hashCode();
    return hashCode;
}