【问题标题】:Swapping elements in an array Java交换数组Java中的元素
【发布时间】:2021-06-01 15:05:54
【问题描述】:

我正在学校应对课堂挑战。我们必须很棒的船班和海港班。我已经完成了所有测试,除了最后一次测试船停在港口的位置。 Harbor 构造函数包含一个 Harbor 数组。

我们必须运行的测试在下面,我编写的代码(用于 Harbor 类)在下面。 新鲜的眼睛很有帮助!

@Test
    void testboatStock()
    {
        Boat boat1 = new Boat("BMC", Color.GREEN);
        Boat boat2 = new Boat("BMX", Color.RED);
        Boat boat3 = new Boat("UXB", Color.YELLOW);
        
        Harbor stock = new Harbor(5);
        assertEquals(null, stock.getBoatAt(0));
        assertEquals(null, stock.getBoatAt(1));
        assertEquals(null, stock.getBoatAt(2));
        assertEquals(null, stock.getBoatAt(3));
        assertEquals(null, stock.getBoatAt(4));
        
        // Hint: parkBoatAt is not just a accessor, and not just a mutator
        assertEquals(null, stock.parkBoatAt(boat1, 3));
        Boat retrievedBoat = stock.parkBoatAt(boat2, 3);
        assertEquals(boat1, retrievedBoat);
        retrievedBoat = stock.parkBoatAt(boat3, 3);
        assertEquals(boat2, retrievedBoat);
        Boat[] inventory = stock.getInventory();
        assertArrayEquals(new Boat[]{null, null, null, boat3, null}, inventory);
        stock.parkBoatAt(boat2, 1);
        assertArrayEquals(new Boat[]{null, null, null, boat3, null}, inventory); // this is correct!
        assertArrayEquals(new Boat[]{null, boat2, null, boat3, null}, stock.getInventory());
    }
public class Harbor
{
    private int slipNumber = 0;
    private Boat[] boats = new Boat[slipNumber];
    
    public Boat parkBoatAt(Boat boat, int slipNumber)
    {
        boat = boats[slipNumber];
        if(boats[slipNumber]== boat)
        {
            
            return boat;
        }
        else
        {
            return null;
        }
    }
    public Boat getBoatAt(int slipNumber)
    {
        if(boats[slipNumber]==null)
        {
            return null;
        }
        return boats[slipNumber];
    }
    
    public Boat[] getInventory()
    {
        return boats;
    }
    public Harbor(int numberOfSlips)
    {
         boats = new Boat[numberOfSlips];
    }
    public Harbor()
    {
        
    }

}

【问题讨论】:

  • 为什么你的parkBoatAt 没有真正停船?方法名称不是说它应该这样做吗?
  • 我以为我是用boat=boats[slipNumber];
  • 这些测试让我很困惑,但基础是 Harbour 最初是空的。去停船时,如果该位置可用或被占用,它将返回。因此,船的初始停放返回该位置是空的。然后接下来的测试显示之前测试中停放的船在那儿等等。

标签: java arrays class


【解决方案1】:
public Boat parkBoatAt(Boat newBoat, int slipNumber) {   // 1
  Boat oldBoat = boats[slipNumber];
  boats[slipNumber] = newBoat;
  return oldBoat;
}

public Boat[] getInventory() {
  return Arrays.copyOf(this.boats, this.boats.length);   // 2
}
  1. 您需要返回数组中元素的前一个值。
  2. 您需要复制数组以确保它没有改变。

【讨论】:

    【解决方案2】:

    在您的问题中,它被写为方法testboatStock() 的代码中的注释。即……

    提示:parkBoatAt 不仅仅是一个访问器,也不仅仅是一个修改器

    这些要求对我来说并不完全清楚,但我认为方法parkBoat 应该检查数组boats 中索引slipNumber 的元素是否为空。如果是,则将boat放入该索引处的数组中并返回boat,从而表明boat已成功停放。否则,即如果数组索引已经包含boat,则表示该位置已被占用,您不能将两艘船停在同一位置。

    public Boat parkBoatAt(Boat boat, int slipNumber)
    {   
        if(boats[slipNumber]== null)  // Change here.
        {
            boats[slipNumber] = boat;  // Added this line.
            return boat;
        }
        else
        {
            return null;
        }
    }
    

    基本上我只是在您的代码中添加了一行并更改了if 条件。另请注意,首先检查方法参数可能是个好主意,即 boat 不为 null 并且 slipNumber 介于 0(零)和数组 boats 的大小之间。

    【讨论】:

      猜你喜欢
      • 2012-11-25
      • 2012-09-21
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 2017-01-30
      • 2010-10-26
      • 1970-01-01
      相关资源
      最近更新 更多