我的Swap方法不起作用。任何人都可以帮助弄清楚什么是错的?

时间:2014-02-19 02:19:33

标签: java

好的,所以我的节目会让孩子们乘坐公共汽车并按特定顺序坐着。然后两个孩子应该换掉可以改变订单的座位。之后,两个孩子离开,另一个上车。这就是该计划的作用。一切正常,除了我的交换方法,其中两个孩子应该换位。

以下是代码:

public class Bus
{

private String names[] = new String[10];

public void getOn(String name)
{
    int i = findFirstEmpty();

    if (i >= 0)
    {
        names[i] = name;
    }
    else
    {
        System.out.println("The bus is at maximum capacity");
    }
}

public int findFirstEmpty()
{
    for (int i = 0; i <= names.length; i++){
        if (names[i] == null){
            return i;
        }
    }
    return -1;
}

public void print()
{
    for (int i = 0; i < 10; i++)
    {
        if (names[i] != null){
            System.out.println(i + " , " + names[i]);
        }
    }
}

public void getOff(String name)
{
    for(int i=0;i<10;i++)
    {
        if (name.equals(names[i])){
            names[i] = null;
        }
    }
}

public void swap(String name1, String name2)
{
        String temp = name1;
        name1 = name2;
        name2 = temp;
}

public static void main(String[] args)
{

    System.out.println("The bus pulls up and the children load onto it.");
    System.out.println();

    Bus bus = new Bus();

    String name = "Joe";
    bus.getOn(name);

    name = "Jeff";
    bus.getOn(name);

    name = "Erica";
    bus.getOn(name);

    name = "Bob";
    bus.getOn(name);

    System.out.print("After loading the children onto the bus, this is who the bus contains: ");
    System.out.println();

    bus.print();
    System.out.println();

    bus.swap("Jeff", "Bob");

    System.out.print("After swapping Jeff's and Bob's seats, this is who remains on the bus: ");
    System.out.println();

    bus.print();
    System.out.println();

    name = "Erica";
    bus.getOff(name);

    name = "Bob";
    bus.getOff(name);

    System.out.print("After Erica and Bob exited the bus, this is who remains: ");
    System.out.println();
    bus.print();

    name = "Nancy";
    bus.getOn(name);

    System.out.println();
    System.out.print("After Nancy enters the bus, this is who the bus contains: ");
    System.out.println();
    bus.print();
}
}

这是打印出来的内容:

  

公共汽车停下来,孩子们把它装上去。

     

将孩子们装上公共汽车后,这是公共汽车包含的人:   0,乔   1,杰夫   2,埃里卡   3,鲍勃

     

交换了Jeff和Bob的座位之后,这是谁还在公交车上:   0,乔   1,杰夫   2,埃里卡   3,鲍勃

     

埃里卡和鲍勃退出公共汽车后,剩下的就是:   0,乔   1,杰夫

     

南希进入公交车后,这是公交车包含的人:   0,乔   1,杰夫   2,南希

注意杰夫和鲍勃应该交换,但他们不会。任何人都可以帮助我,我一直想弄清楚,但我不确定什么是错的。

6 个答案:

答案 0 :(得分:1)

public void swap(String name1, String name2)
{
        String temp = name1;
        name1 = name2;
        name2 = temp;
}

您可以在此处交换局部变量name1name2的值。它不会影响您的names数组,因此实际上并没有做任何事情。

您需要实际访问names数组,找到name1name2数组中的现有位置,并在数组中交换它们

答案 1 :(得分:1)

Java与C / C ++不同,您可以通过引用传递对象。因此,为了交换两个对象,可以将名称字符串包装在名为Person的类中,然后执行以下操作:

public void swap(Person p1, Person p2)
{
        String temp = p1.name;
        p1.name = p2.name;
        p2.name = temp;
}

答案 2 :(得分:1)

因为Java是严格按值传递的,所以swap()方法内部的交换不会反映到调用方法。

您可以按如下方式重写swap方法:

public void swap(String name1, String name2) {

        int position1 = -1;
        int position2 = -1;

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

            if (name1.equals(names[i])) {
                position1 = i;
            }

            if (name2.equals(names[i])) {
                position2 = i;
            }
        }

        if ( position1 != -1 && position2 != -1 ) {

            String temp = names[position1];
            names[position1] = names[position2];
            names[position2] = temp;
         }
    }

答案 3 :(得分:0)

你应该看一下Is Java "pass-by-reference" or "pass-by-value"?,记住字符串是immutable个对象。

答案 4 :(得分:0)

在Java中进行数组交换的唯一方法是这样的:

public void swap(Object[] array, int i, int j) {
  // TODO: validate i and j...
  Object iVal = array[i];
  array[i] = array[j];
  array[j] = iVal;
}

除此之外别无他法。它有点尴尬,最重要的是它不适用于内置类型(int,double,float,byte,char,long),但仅限于它们的盒装对应物,需要内置类型的专用版本(就像在{ {1}})。

作为旁注,值得注意的是java.util.Arrays是从Object[]继承的所有对象数组的超类型,即ObjectString[]的子类型,但Object[]不是。

答案 5 :(得分:-3)

我建议使用StringBuilder对象

public void swap(StringBuilder name1, StringBuilder name2)
{
        StringBuilder temp = name1;
        name1 = name2;
        name2 = temp;
}