字符串数组添加重复项

时间:2014-10-22 13:05:48

标签: java arrays

我尝试将项目添加到米阵列。每个项目都从Meter.load(sc)返回,返回一个Meter。当我尝试打印项目以检查输出时, 第一个测试正确打印出所有项目,但第二个测试失败,只显示最后一个项目重复。由于这个问题,我无法从其他课程中调用getMeterNumbers

任何人都可以帮我吗?谢谢。

public class CommercialAccount extends Account {

private Meter[] meters;

public CommercialAccount(AccountNumber accountNumber, Meter[] meters) {
    this.accountNumber = accountNumber;
    this.meters = meters;
}

public CommercialAccount(Scanner sc, AccountNumber accountNumber) {
    this.accountNumber = accountNumber;
    int n = sc.nextInt();
    sc.nextLine();
    meters = new Meter[n];
    for (int i = 0; i < n; i++) {
        meters[i] = Meter.load(sc);
        System.out.println("Test 1: " + meters[i].toString());
    }
    for (int i = 0; i < meters.length; i++) {
        System.out.println("Test 2: " + meters[i].toString());
    }
}

public String toString() {
    return accountNumber.toString() + " C " + meters.length;
}

public MeterNumber[] getMeterNumbers() {
    MeterNumber[] ms = new MeterNumber[meters.length];
    for (int i = 0; i < meters.length; i++) {
        ms[i] = meters[i].getMeterNumber();
    }
    return ms;
}
}

控制台打印

Test 1: 356 926 850 
Test 1: 101 949 516 
Test 1: 911 221 326 
Test 1: 241 329 198 
Test 1: 569 096 301 
Test 1: 629 316 190 
Test 1: 537 224 159 
Test 2: 537 224 159 
Test 2: 537 224 159 
Test 2: 537 224 159 
Test 2: 537 224 159 
Test 2: 537 224 159 
Test 2: 537 224 159 
Test 2: 537 224 159     

更新:  发现我的错误,我的Meter类中的所有属性都是静态的,所以这就是原因所在。谢谢大家。

2 个答案:

答案 0 :(得分:4)

您的问题可能有两种原因:

  1. Meter.load(sc)始终返回相同的Meter实例。这可以解释为什么数组中的所有元素都是相同的。
  2. Meter类中的所有属性都是静态的,因此所有实例都共享相同的值。
  3. 编辑:根据OP的评论,问题是将Meter类中的属性定义为静态。

答案 1 :(得分:2)

我们来看一个简单的例子。如果你这样做:

int n = 5;
Foo[] foo = new Foo[n];
for (int i = 0; i < n; i++)
{
    foo[i] = getFoo("test" + i);
    System.out.println("Test 1: " + foo[i].toString());
}

for (int i = 0; i < foo.length; i++)
{
    System.out.println("Test 2: " + foo[i].toString());
}

private Foo getFoo(String s)
{
    Foo f = new Foo();
    f.s = s;
    return f;
}

private class Foo
{
    public String s;

    public String toString()
    {
        return s;
    }
}

它正在工作,因为foo的每个元素都是不同的实例。

Test 1: test0
Test 1: test1
Test 1: test2
Test 1: test3
Test 1: test4
Test 2: test0
Test 2: test1
Test 2: test2
Test 2: test3
Test 2: test4

但在这种情况下(一定是你的):

int n = 5;
Foo[] foo = new Foo[n];
for (int i = 0; i < n; i++)
{
    foo[i] = getFoo("test" + i);
    System.out.println("Test 1: " + foo[i].toString());
}

for (int i = 0; i < foo.length; i++)
{
    System.out.println("Test 2: " + foo[i].toString());
}

private static Foo getFoo(String s)
{
    Foo f = Foo.f;
    f.s = s;
    return f;
}

private static class Foo
{
    public static Foo f = new Foo();

    public String s;

    public String toString()
    {
        return s;
    }
}

Test 1: test0
Test 1: test1
Test 1: test2
Test 1: test3
Test 1: test4
Test 2: test4
Test 2: test4
Test 2: test4
Test 2: test4
Test 2: test4

它不起作用,第一个循环是好的,因为数组是空的,每个元素只是设置有最后一个值。当数组已满时,第二个循环失败,每个元素引用同一个对象。

=&GT;修改您的load方法以返回不同的实例。