簡體   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