在方法中检索数组的长度不起作用
Retrieving length of an array in a method doesn't work
我是 Java 的新手,所以请想象我 5 岁,需要一个适合 5 岁孩子的答案。
首先是一些信息:
我正在尝试制作一个 "Dynamic array" 可以在需要时增长和收缩。我知道 arraylists,这样做的目的是我需要能够自己做到这一点并同时学习,因为我认为这就是 ArrayList
s 的工作方式。
问题: 由于上述原因,我想添加一些奇特的方法,其中之一是计算整个数组的平均值。
当我尝试获取长度 (varible.length
) 时,它是否不起作用,而在其他一些方法中却起作用!
这是行不通的方法:
public double meanValue() {
double meanDiv = 0;
int div = x.length;
for (int i = 0 ; i < div ; i++) {
meanDiv += x[i];
System.out.println("Testing");
}
meanDiv = meanDiv/x.length;
return meanDiv;
}
它是 returning NaN(不是数字),但是如果你跳过除法部分它 returns 0,它完全不是读 x.length
。
最糟糕的部分?有些方法是有效的,例如这个到 return 最后一个位置:
public long last() {
long pepe = -1;
if (x.length==0) {
System.out.println("Nothing in the array! Returning -1");
}
else {
pepe = x[x.length-1];
}
return pepe;
}
我尝试了太多东西,不同种类的变量,while 而不是 for 等等
这里是完整的 class 如果需要的话:
public class dynamicArray {
private long[] x;
private int size = 0;
public dynamicArray() {
x = new long[size];
} // CREATES THE ARRAY
public long grab(int x) {
if (x < this.x.length) {
return this.x[x];
}
else {
System.out.println("(GET) Out of bounds");
return -1;
}
}
public void add(long value) {
dynamicInAction();
x[size] = value;
size++;
} // ADD A NUMBER TO THE ARRAY
public void remove(int position) {
} // REMOVES A SPECIFIC ARRAY POSITION----------------
public long last() {
long pepe = -1;
if (x.length==0) {
System.out.println("Nothing in the array! Returning -1");
}
else {
pepe = x[x.length-1];
}
return pepe;
} // RETURNS THE VALUE IN THE LAST POSITION
public long first() {
long pepe = -1;
if (x.length==0) {
System.out.println("Nothing in the array! Returning -1");
}
else {
pepe = x[0];
}
return pepe;
} // RETURNS THE VALUE IN THE FIRST POSITION
public void modify(int position, int value) {
if (position < x.length && position >= 0) {
x[position] = value;
}
else {
System.out.println("This position does not exist");
}
} // MODIFIES A SPECIFIC POSITION TO THE ASSIGNED VALUE
public int size() {
return x.length;
} // RETURNS THE CURRENT ARRAY SIZE
public double meanValue() {
double meanDiv = 0;
int div = x.length;
for (int i = 0 ; i < div ; i++) {
meanDiv += x[i];
System.out.println("Testing");
}
meanDiv = meanDiv/x.length;
return meanDiv;
} // RETURNS THE MEAN VALUE OF THE WHOLE ARRAY-------------
public long median() {
return -1;
} // RETURNS THE MEDIAN VALUE OF THE WHOLE ARRAY-------------
private void dynamicInAction() {
if (x.length == size) {
long[] temp = new long[x.length];
for (int i = 0; i<x.length ; i++) {
temp[i] = x[i];
}
x = null;
//System.gc(); // Might be unnecessary
x = new long[size+1];
for (int i = 0; i<temp.length ; i++) {
x[i] = temp[i];
}
}
} // ENSURES THE ARRAY GROWS WHEN NEEDED
public void reverse() {
} // REVERSING ALL POSITIONS IN THE ARRAY------------------
public void clear() {
x = null;
size = 0;
x = new long[size];
} // CLEARS THE ARRAY
}
您正在构造函数中创建一个大小为 0 的数组。这意味着除非您将 x 重新分配给另一个数组,否则它将始终有 0 个元素。尝试像这样在构造函数中传递大小:
public DynamicArray(int size){
this.size = size;
this.x = new long[size];
}
此外,在 Java class 中,名称中的每个单词都有大写字母(注意 DynamicArray 而不是 dynamicArray)。
您的项目有效。这是您的代码
public class HelloWorld{
public static void main(String []args){
dynamicArray s = new dynamicArray();
s.add(1);
s.add(3);
System.out.println(s.meanValue());
}
}
结果:
2.0
因此,您需要在调用之前至少添加 1 个元素 "meanValue()"
你的 class meanValue 中的这两个方法和最后一个在我 运行 它们时工作正常。
这些是它向我展示的系统输出:
Testing
Testing
Testing
Testing
mean 3.25
last 5
我用来创建您的 class 对象并使用它的代码。
public static void main(String ...args) {
DynamicArray myArr = new DynamicArray();
myArr.add(1);
myArr.add(2);
myArr.add(5);
myArr.add(5);
System.out.println("mean " + myArr.meanValue());
System.out.println("last " + myArr.last());
}
前面的答案是正确的,您已将大小初始化为 0。
但这不是你真正的问题。
您有 2 个主要问题:
1) 在你的 dynamicInAction
- 你永远不会增加这个方法中数组的大小!您只需创建一个相同大小的临时数组,将 x 内容复制到临时数组,然后将 x 分配给临时数组,永远不会增加大小。在创建新的临时数组时,您需要稍微调整以增加大小。我是 'pre-incrementing' 大小,以便在创建新临时数组时使用新值:
private void dynamicInAction() {
if (x.length == size) {
long[] temp = new long[++size];
for (int i = 0; i<x.length ; i++) {
temp[i] = x[i];
}
//Just assign x to temp
x = temp;
//x = null; Unnecessary
//System.gc(); // Unnecessary
//Dont create another array, you already have temp..just assign it
//x = new long[size+1];
//for (int i = 0; i<temp.length ; i++) {
// x[i] = temp[i];
//}
}
}
2) 其次,您现在不需要在 add 方法中增加大小,只需设置值:
public void add(long value) {
dynamicInAction();
x[size-1] = value;
//size++; Unnecessary
}
我是 Java 的新手,所以请想象我 5 岁,需要一个适合 5 岁孩子的答案。
首先是一些信息:
我正在尝试制作一个 "Dynamic array" 可以在需要时增长和收缩。我知道 arraylists,这样做的目的是我需要能够自己做到这一点并同时学习,因为我认为这就是 ArrayList
s 的工作方式。
问题: 由于上述原因,我想添加一些奇特的方法,其中之一是计算整个数组的平均值。
当我尝试获取长度 (varible.length
) 时,它是否不起作用,而在其他一些方法中却起作用!
这是行不通的方法:
public double meanValue() {
double meanDiv = 0;
int div = x.length;
for (int i = 0 ; i < div ; i++) {
meanDiv += x[i];
System.out.println("Testing");
}
meanDiv = meanDiv/x.length;
return meanDiv;
}
它是 returning NaN(不是数字),但是如果你跳过除法部分它 returns 0,它完全不是读 x.length
。
最糟糕的部分?有些方法是有效的,例如这个到 return 最后一个位置:
public long last() {
long pepe = -1;
if (x.length==0) {
System.out.println("Nothing in the array! Returning -1");
}
else {
pepe = x[x.length-1];
}
return pepe;
}
我尝试了太多东西,不同种类的变量,while 而不是 for 等等
这里是完整的 class 如果需要的话:
public class dynamicArray {
private long[] x;
private int size = 0;
public dynamicArray() {
x = new long[size];
} // CREATES THE ARRAY
public long grab(int x) {
if (x < this.x.length) {
return this.x[x];
}
else {
System.out.println("(GET) Out of bounds");
return -1;
}
}
public void add(long value) {
dynamicInAction();
x[size] = value;
size++;
} // ADD A NUMBER TO THE ARRAY
public void remove(int position) {
} // REMOVES A SPECIFIC ARRAY POSITION----------------
public long last() {
long pepe = -1;
if (x.length==0) {
System.out.println("Nothing in the array! Returning -1");
}
else {
pepe = x[x.length-1];
}
return pepe;
} // RETURNS THE VALUE IN THE LAST POSITION
public long first() {
long pepe = -1;
if (x.length==0) {
System.out.println("Nothing in the array! Returning -1");
}
else {
pepe = x[0];
}
return pepe;
} // RETURNS THE VALUE IN THE FIRST POSITION
public void modify(int position, int value) {
if (position < x.length && position >= 0) {
x[position] = value;
}
else {
System.out.println("This position does not exist");
}
} // MODIFIES A SPECIFIC POSITION TO THE ASSIGNED VALUE
public int size() {
return x.length;
} // RETURNS THE CURRENT ARRAY SIZE
public double meanValue() {
double meanDiv = 0;
int div = x.length;
for (int i = 0 ; i < div ; i++) {
meanDiv += x[i];
System.out.println("Testing");
}
meanDiv = meanDiv/x.length;
return meanDiv;
} // RETURNS THE MEAN VALUE OF THE WHOLE ARRAY-------------
public long median() {
return -1;
} // RETURNS THE MEDIAN VALUE OF THE WHOLE ARRAY-------------
private void dynamicInAction() {
if (x.length == size) {
long[] temp = new long[x.length];
for (int i = 0; i<x.length ; i++) {
temp[i] = x[i];
}
x = null;
//System.gc(); // Might be unnecessary
x = new long[size+1];
for (int i = 0; i<temp.length ; i++) {
x[i] = temp[i];
}
}
} // ENSURES THE ARRAY GROWS WHEN NEEDED
public void reverse() {
} // REVERSING ALL POSITIONS IN THE ARRAY------------------
public void clear() {
x = null;
size = 0;
x = new long[size];
} // CLEARS THE ARRAY
}
您正在构造函数中创建一个大小为 0 的数组。这意味着除非您将 x 重新分配给另一个数组,否则它将始终有 0 个元素。尝试像这样在构造函数中传递大小:
public DynamicArray(int size){
this.size = size;
this.x = new long[size];
}
此外,在 Java class 中,名称中的每个单词都有大写字母(注意 DynamicArray 而不是 dynamicArray)。
您的项目有效。这是您的代码
public class HelloWorld{
public static void main(String []args){
dynamicArray s = new dynamicArray();
s.add(1);
s.add(3);
System.out.println(s.meanValue());
}
}
结果:
2.0
因此,您需要在调用之前至少添加 1 个元素 "meanValue()"
你的 class meanValue 中的这两个方法和最后一个在我 运行 它们时工作正常。 这些是它向我展示的系统输出:
Testing
Testing
Testing
Testing
mean 3.25
last 5
我用来创建您的 class 对象并使用它的代码。
public static void main(String ...args) {
DynamicArray myArr = new DynamicArray();
myArr.add(1);
myArr.add(2);
myArr.add(5);
myArr.add(5);
System.out.println("mean " + myArr.meanValue());
System.out.println("last " + myArr.last());
}
前面的答案是正确的,您已将大小初始化为 0。 但这不是你真正的问题。
您有 2 个主要问题:
1) 在你的 dynamicInAction
- 你永远不会增加这个方法中数组的大小!您只需创建一个相同大小的临时数组,将 x 内容复制到临时数组,然后将 x 分配给临时数组,永远不会增加大小。在创建新的临时数组时,您需要稍微调整以增加大小。我是 'pre-incrementing' 大小,以便在创建新临时数组时使用新值:
private void dynamicInAction() {
if (x.length == size) {
long[] temp = new long[++size];
for (int i = 0; i<x.length ; i++) {
temp[i] = x[i];
}
//Just assign x to temp
x = temp;
//x = null; Unnecessary
//System.gc(); // Unnecessary
//Dont create another array, you already have temp..just assign it
//x = new long[size+1];
//for (int i = 0; i<temp.length ; i++) {
// x[i] = temp[i];
//}
}
}
2) 其次,您现在不需要在 add 方法中增加大小,只需设置值:
public void add(long value) {
dynamicInAction();
x[size-1] = value;
//size++; Unnecessary
}