【问题标题】:Why are the array indexes not being swapped?为什么数组索引没有被交换?
【发布时间】:2014-03-05 05:42:03
【问题描述】:

我正在尝试交换要交换的数组位置,但它不起作用。无论我做什么,我都无法交换它们,我知道这与我编写 if 语句的方式有关。

这是main中的代码:

  Comparable[] computerSizes = new Comparable[3];

   int a = computerSizes.length - 1;



   computerSizes[0] = new Desktop("i5","Desktop",4,1024,250); 
   computerSizes[1] = new Desktop("i3","Desktop",6,512,350); 
   computerSizes[2] = new Laptop(15.6,"i3","Laptop",4,0,750); 

   for (int i = 0; i < a;i++) {

     if(computerSizes[i].compareTo(computerSizes[i+1]) == 1){
          computerSizes[i] = computerSizes[i+1];
          computerSizes[i+1] = computerSizes[i];
        }//end if
     System.out.println(computerSizes[i]);
    }//end for

这里是相关的 compareTo 方法代码:

 public int compareTo(Comparable c)
{   
    Computer a = (Computer)c;


     if (this.cost == a.cost)
        return 0;
     else if (this.cost > a.cost)
        return 1;
     else
        return -1;



}

0 处的索引大于 1 处的索引,但为了澄清起见,我将包括相关公式:

cost = 150 + 6.50 * super.ram + 0.15 * super.hdd + 0.48 * super.vRam;

Desktop(PROCESSOR,TYPE,RAM,VRAM,HDD SPACE):这就是参数的意思。

【问题讨论】:

  • 认真的吗?你不能那样交换!!
  • 乍一看很疯狂。我忘了“=”是一条双向街道。

标签: java arrays object


【解决方案1】:

线条

computerSizes[i] = computerSizes[i+1];
computerSizes[i+1] = computerSizes[i];

不要做你所期望的。它首先将computerSizes[i+1] 的值分配给computerSizes[i]。在那一刻,两者是平等的。然后将computerSizes[i] 的值分配给computerSizes[i+1]。最后,两者将相等。

为了交换值,请使用时间变量:

Comparable temp = computerSizes[i];
computerSizes[i] = computerSizes[i+1];
computerSizes[i+1] = temp;

【讨论】:

  • 不幸的是它没有解决我的程序,只是那个特定的部分。显然,问题远不止于此。
【解决方案2】:

使用 Temp Comparable 进行 SWAP

  Comparable tempComparable;
  if(computerSizes[i].compareTo(computerSizes[i+1]) == 1){
          tempCoparable = computerSizes[i];
          computerSizes[i] = computerSizes[i+1];
          computerSizes[i+1] = tempComparable;
        }//end if

【讨论】:

    【解决方案3】:

    让我们考虑一个数组:new int[3]{ 1, 2, 3 };

    你正在做的是:

    a[i] = a[i+1];
    a[i+1] = a[i];
    

    哪一个(让 i = 0):

    1. {1,2,3}   
    2. {2,2,3}   |a[0] i.e. 1 gets replaced by 2
    3. {2,2,3}   |a[1] i.e. 2 gets replaced by 2 (though it must be replaced by 1)
    

    因此,必须有一种方法来保留临时变量。 让我们考虑以下几点:

    Computer temp = computerSizes[i];
    computerSizes[i] = computerSizes[i+1];
    computerSizes[i+1] = temp;
    

    这将给出所需的结果。

    【讨论】:

      【解决方案4】:

      交换代码不正确。应该是

        if(computerSizes[i].compareTo(computerSizes[i+1]) == 1){
                    Computer temp = computerSizes[i]
                    computerSizes[i] = computerSizes[i+1];
                    computerSizes[i+1] = temp ;
                  }//end if
      

      【讨论】:

        【解决方案5】:

        正如各种答案所说,您的交换代码不起作用,因为您没有中间变量

              myarray[i] = myarray[i+1];  // both i and i+1 now refer to the same object
              myarray[i+1] = myarray[i];  // so this line has no effect
        

        如果您的目标是对您的对象进行排序,您可以通过提供一个比较器对象来使用Arrays.sort() 进行此操作 - 请参阅documentation

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多