如何停止更新其外部数组的方法

时间:2018-02-22 15:55:07

标签: java methods

希望得到一些帮助 - 我被要求使用uni的方法编写酒店房间系统。一切顺利,直到我尝试按字母顺序排列数组。

我已经设法让它在方法中订购,但它更新了主阵列(酒店)。我希望它保持在订单方法中,如果这有意义吗?

我在下面包含了一个没有所有功能的缩减版本。

目前它将对阵列酒店进行重新排序,因此,如果您查看房间,阵列将打印出像e,e,e等,George,Peter,Robert'而不是保持其原始形式,罗伯特,彼得,e,e等,乔治'

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    String roomName;
    int roomNum = 0;
    String[] hotelRef = new String[12];
    String[] hotel = new String[12];
    initialise(hotel); //initialise
    while (roomNum < 13) {
        System.out.println("Please select from the menu:");
        System.out.println("V : View rooms");
        System.out.println("O : Order Guests alphabetically");
        String selection = input.next();
        switch (selection) {
            //There are more switch cases on the original version
            case "O":
                order(hotel);
                break;
            default:
                System.out.println("");
        }
    }
}

private static void order(String[] hotelRef) {
    int j;
    boolean flag = true; //will determine when the sort is finished
    String temp;
    String[] order = new String[12];
    order = hotelRef;

    while (flag) {
        flag = false;
        for (j = 0; j < order.length - 1; j++) {
            if (order[j].compareToIgnoreCase(order[j + 1]) > 0) { 
                //ascending sort
                temp = order[j];
                order[j] = order[j + 1]; // swapping
                order[j + 1] = temp;
                flag = true;
            }
        }
    }
    for (int y = 0; y < order.length; y++) {
        if (!order[y].equals("e")) {
            System.out.println("Room " + y + " is occupied by " + order[y]);
        }
    }
    System.out.println("Ordering completed");
}

3 个答案:

答案 0 :(得分:1)

您应该克隆hotelRef而不是像order = hotelRef;

那样分配引用

您可以在创建订单数组时执行以下操作:

String[] order = new String[hotelRef.length]; // to make sure that order has the right size.

而不是order = hotelRef;

for (int i=0;i<order.length;i++)
   order[i]=hotelRef[i]; // thereby cloning

或使用System.arraycopy()或任何其他方法来完成克隆数组。

答案 1 :(得分:0)

您可以在订购方式中复制酒店阵列:

String[] hotelCopy = new String[hotelRef.length];
System.arraycopy(hotelRef, 0, hotelCopy, 0, hotelRef.length);

然后在订单方法中使用hotelCopy。

答案 2 :(得分:0)

问题在于以下一行

  

order = hotelRef;

将其更改为

  

order = hotelRef.clone();

虽然您正在创建新对象,但您只分配了对外部对象的引用。因此,无论你在内部对象中做出什么改变,它都会被反射到外部对象。