好的,所以我的节目会让孩子们乘坐公共汽车并按特定顺序坐着。然后两个孩子应该换掉可以改变订单的座位。之后,两个孩子离开,另一个上车。这就是该计划的作用。一切正常,除了我的交换方法,其中两个孩子应该换位。
以下是代码:
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,南希
答案 0 :(得分:1)
public void swap(String name1, String name2)
{
String temp = name1;
name1 = name2;
name2 = temp;
}
您可以在此处交换局部变量name1
和name2
的值。它不会影响您的names
数组,因此实际上并没有做任何事情。
您需要实际访问names
数组,找到name1
和name2
数组中的现有位置,并在数组中交换它们 。
答案 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[]
继承的所有对象数组的超类型,即Object
是String[]
的子类型,但Object[]
不是。
答案 5 :(得分:-3)
我建议使用StringBuilder对象
public void swap(StringBuilder name1, StringBuilder name2)
{
StringBuilder temp = name1;
name1 = name2;
name2 = temp;
}