Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我的交换方法不起作用。有人能帮我找出是什么问题吗?_Java - Fatal编程技术网

Java 我的交换方法不起作用。有人能帮我找出是什么问题吗?

Java 我的交换方法不起作用。有人能帮我找出是什么问题吗?,java,Java,好的,我的节目展示了孩子们上公共汽车,按照特定的顺序坐着。然后两个孩子交换座位,这样可以改变顺序。之后,两个孩子离开,另一个上了公共汽车。这就是程序所做的。除了我的交换方法,所有的东西都能找到。在我的交换方法中,两个孩子应该交换座位 代码如下: public class Bus { private String names[] = new String[10]; public void getOn(String name) { int i = findFirstEmpty();

好的,我的节目展示了孩子们上公共汽车,按照特定的顺序坐着。然后两个孩子交换座位,这样可以改变顺序。之后,两个孩子离开,另一个上了公共汽车。这就是程序所做的。除了我的交换方法,所有的东西都能找到。在我的交换方法中,两个孩子应该交换座位

代码如下:

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();
}
}
公共类总线
{
私有字符串名称[]=新字符串[10];
public void getOn(字符串名称)
{
int i=findFirsty();
如果(i>=0)
{
名称[i]=名称;
}
其他的
{
System.out.println(“总线处于最大容量”);
}
}
public int findFirstEntry()
{
对于(int i=0;i
在这里,您交换的是局部变量
name1
name2
的值。这不会影响
names
数组,因此实际上没有任何作用


您需要实际访问
名称
数组,找到
名称1
名称2
数组中的现有位置,并在数组中交换它们。

您应该看看这里,记住字符串是不可变的
对象。

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

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

我建议使用StringBuilder对象

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

因为Java严格按值传递,所以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;
         }
    }
公共无效交换(字符串名称1、字符串名称2){
int位置1=-1;
int位置2=-1;
对于(int i=0;i<10;i++){
if(name1.equals(names[i])){
位置1=i;
}
if(name2.equals(names[i])){
位置2=i;
}
}
如果(位置1!=-1和位置2!=-1){
字符串温度=名称[position1];
名称[position1]=名称[position2];
姓名[职位2]=临时职位;
}
}

在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),而只适用于它们的盒装对应类型,需要内置类型的专用版本(就像在
java.util.Arrays
中一样)


作为旁注,值得注意的是,
Object[]
是继承自
Object
的所有对象数组的超类型,也就是说,
String[]
Object[]
的子类型,但是
byte[]
不是。

我们假设按照我写下的方式使用该方法,所以我不确定如何使它像这样工作。如果你不允许像在帖子中那样更改交换方法签名,那么在Java中就没有办法进行交换。确实有-查找数组中字符串的位置。嗯,这仍然只是交换cal引用。你是想以某种方式交换它们的内容吗?糟糕,是的,它应该使用replace()函数:/
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;
}