Java 字符串数组添加重复项
我尝试将项目添加到米数组中。每个项目都从Java 字符串数组添加重复项,java,arrays,Java,Arrays,我尝试将项目添加到米数组中。每个项目都从Meter.load(sc)返回,后者返回一个米。当我试图打印项目以检查输出时, 第一个测试正确地打印出所有项目,但第二个测试失败,只显示最后一个重复的项目。由于这个问题,我无法从其他类调用getMeterNumber 有人能帮我吗?多谢各位 public class CommercialAccount extends Account { private Meter[] meters; public CommercialAccount(AccountN
Meter.load(sc)
返回,后者返回一个米。当我试图打印项目以检查输出时,
第一个测试正确地打印出所有项目,但第二个测试失败,只显示最后一个重复的项目。由于这个问题,我无法从其他类调用getMeterNumber
有人能帮我吗?多谢各位
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;
}
}
更新:
发现我的错误,我的Meter类中的所有属性都是静态的,这就是原因。谢谢大家。您的问题可能有两个原因:
Meter.load(sc)
始终返回相同的Meter
实例。这就解释了为什么数组中的所有元素都是相同的Meter
类中的所有属性都是静态的,因此所有实例共享相同的值编辑:根据OP的评论,问题是将Meter类中的属性定义为static。问题可能有两个原因:
Meter.load(sc)
始终返回相同的Meter
实例。这就解释了为什么数组中的所有元素都是相同的Meter
类中的所有属性都是静态的,因此所有实例共享相同的值编辑:根据OP的评论,问题在于将Meter类中的属性定义为static。让我们举一个简单的例子。如果您这样做:
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;
}
}
但在这种情况下(它必须是你的):
int n=5;
Foo[]Foo=新的Foo[n];
对于(int i=0;i
它不工作,第一个循环很好,因为数组是空的,每个元素只是设置了最后一个值。第二个循环失败,因为数组已满,每个元素都引用同一个对象
=>修改您的
load
方法以返回不同的实例。让我们举一个简单的例子。如果您这样做:
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;
}
}
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=新的Foo[n];
对于(int i=0;i
它不工作,第一个循环很好,因为数组是空的,每个元素只是设置了最后一个值。第二个循环失败,因为数组已满,每个元素都引用同一个对象
=>修改您的
load
方法以返回不同的实例。如果是这样,那么的“Test 1”
语句是否也打印相同的?+1。我的错误是你的第二个选择。我的Meter类中的所有属性都是静态的,所以这就是原因。谢谢。@Mena不,每次调用Meter后都会打印“test1”。load(sc)
会更改实例的属性,因此您可以看到单个实例在不同时间点的状态(或类在不同时间点的静态属性状态)。如果是这样,的“test1”不是这样吗
语句也打印相同?+1。我的错误是你的第二个选择。我的Meter类中的所有属性都是静态的,所以这就是原因。谢谢。@Mena不,每次调用Meter.load(sc)
都会打印“test1”。load(sc)更改实例的属性,因此您可以看到单个实例在不同时间点的状态(或类在不同时间点的静态属性状态)。这是一个很好的解释,但正如OP所写,这不是问题所在。问题是Meter类中的静态成员。这是一个很好的解释,但正如OP所写的,这不是问题所在。问题是Meter类中的静态成员。
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