繁体   English   中英

如果 Java 中的数组已满,如何将值传递给 class 中的另一个方法?

[英]How do I pass values to another method in class if the array is full in Java?

我是 Java 的完整初学者,所以我希望我说得通。 我想将值从一种方法存储到另一种方法中的 class 中。

如果第一个 class 方法中的数组已满,我想将值添加到第二种方法中,而不是有更多空间。 我检查第一个方法 inFor 是否已满,然后它应该将参数 newCoin 的值添加到方法 moreSpace 中。 那么我应该在inFor 中调用moreSpace 吗?

 public double inFor(newCoin) {

for(int i = 0; i<arr.length;i++)

 if (arr[i] == null){
  arr[i] = newCoin;

if (i >=arr.length){

  moreSpace(i) //add the values here



 public void moreSpace(){
 String[temp] = new String[arr.length + 1];
for (int i = 0; i < arr.length; i++){
temp[i] = arr[i];
 arr = temp;       

你可以,但它会很丑

public double inFor(newCoin) {
        if (i >=arr.length)
          moreSpace(i) //add the values here
        else{
            for(int i = 0; i<arr.length;i++){
                if (arr[i] == null)
                    arr[i] = newCoin;
            }
        }
}

正如其他人提到的,如果您想使用可变长度数组,请使用 arraylist。 这样您就可以避免不必要地增加和减少数组的大小。 无论如何,您仍然可以在一天结束时将它们转换回数组

您可以根据您的要求在下面使用,但我建议您使用 java 提供的任何动态结构,例如 List。

public double inFor(String newCoin) {
    for (int i = 0; i <= arr.length; i++) {

        if (arr[i] == null) {
            arr[i] = newCoin;

            if (i >= arr.length) {

                moreSpace(arr, newCoin, i); //add the values here
            }
        }
    }
}

public void moreSpace(String arr[], String newCoin, int i){
    arr[i] = new String(); // arr[i] = new String(newCoin);
    arr[i] = newCoin;      // Not needed if you provid value in construtor like commente code
}

这是您使用ArrayList的代码

ArrayList<String> arr = new ArrayList<String>();

public double inFor(String newCoin) {

    arr.add(newCoin);

}

您正在(严重)重新实现 class java.util.ArrayList提供的功能; 我建议你就用那个。

Java 是 'pass by value':对于所有非原始类型(并且 arrays 不是原始类型),值本身就像一个宝藏,而你拥有的变量就像一个宝藏 Z1D78DC8ED51214E5018B5114FEZ44。 所以,在: int[] arr = new int[10]; , new int[10]; bit 是宝贝, int[] arr是 map 到宝贝。 然后,当你写arr = null时,你正在用橡皮擦你的宝藏 map。 这显然对宝物毫无作用。 它还在那里。 如果没有人拥有 map,它就会“丢失”(垃圾收集器最终会清理海滩),但如果其他人拥有您的 map 的副本,即使您已擦除,他们仍然可以访问该阵列你的副本。

然后当你写arr = new int[20]; 您正在创造一个全新的宝藏并将其埋在海滩的某个地方,然后擦除您的宝藏 map(名为arr - 在 java 中,地图有名称,宝藏没有),然后写一个全新的宝藏 Z1D78DC8ED51214E到你新创造的宝藏。 和以前一样,任何拥有 map 副本的人都不会注意到这些。 他们的副本没有更新,因此,如果他们跟随他们的 map,他们会发现根本没有改变的旧宝藏。

每当您将变量传递给方法时,即调用: moreSpace(arr)时,您将获取名为“arr”的宝藏 map,并制作此 map 的副本,然后将副本交给方法。 该方法可以随意弄乱他们的副本,并且不会影响您。 但是,如果他们跟随他们的 map 到宝藏,然后把宝藏弄乱,那会影响到你。 因此,如果 moreSpace 方法这样做: arr = new int[20]; 你不会注意到这一点,它不会更新你对它的看法。 但如果该方法确实如此: arr[0] = 10; 你会注意到: obj.foo()obj[foo]是 java-ese 用于: 跟随宝藏 map 到宝藏,挖掘,然后对宝藏本身采取行动。

那么,以此为背景,你如何“培育宝箱”呢?

好吧,你不能。 java 中的 arrays 不能增长或缩小。 完全没有。 有两种解决方案:

  1. 通过创建一个更大的新宝箱,将所有位从旧的较小宝箱复制到新宝箱,然后将 map 返回到这个新宝箱,让 moreSpace 方法发挥作用moreSpace 您的moreSpace方法看起来像int[] moreSpace(int[] array) ,而不是void moreSpace(int[] array) ,对它的调用将是arr = moreSpace(arr); (这是将您的arr宝藏图更新为新宝藏 map 导致由moreSpace方法创建的新宝藏),而不仅仅是moreSpace(arr);

  2. 创建一个 object(一个宝藏),其中包含一个 map 到另一个宝藏。 这样,您可以将您的 map 的副本交给藏宝图(这是真正的 Nicolas Cage 在 National Treasure 时刻,令人兴奋,不是吗),并且moreSpace map 现在可以创建一个更大的宝箱,把它埋起来,然后按照它从你那里得到的map的副本,找到那个宝藏,把它挖出来,把里面的宝藏map换成它制作的新宝藏,然后就可以了,不返回任何东西.

选项 #2 几乎完全是ArrayList什么。

为什么不使用更多空间,而不是使用Arrays.copy() 它保留原始内容但重新分配数组。

int[] arr = {1,2,3,4};
System.out.println(Arrays.toString(arr));
int newSize = 10;
arr = Arrays.copyOf(arr, newSize);
System.out.println(Arrays.toString(arr));

印刷

[1, 2, 3, 4]
[1, 2, 3, 4, 0, 0, 0, 0, 0, 0]

您始终可以迁移到ArrayList ,但此方法是为希望使用 Arrays 并仍增加容量的人提供的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM