有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java字符串数组添加重复项

我尝试将项目添加到米数组中。每个项目从Meter.load(sc)返回,返回一个米。当我试图打印项目以检查输出时, 第一个测试正确地打印出所有项目,但第二个测试失败,只显示最后一个重复的项目。由于这个问题,我不能从其他类调用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) 个答案

  1. # 1 楼答案

    我们举一个简单的例子。如果您这样做:

    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
    

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

    =>;修改load方法以返回不同的实例

  2. # 2 楼答案

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

    1. Meter.load(sc)始终返回相同的Meter实例。这就解释了为什么数组中的所有元素都是相同的
    2. Meter类中的所有属性都是静态的,因此所有实例共享相同的值

    编辑:根据OP的评论,问题是将Meter类中的属性定义为静态