簡體   English   中英

Java中未知大小的數組

[英]Arrays of Unknown Size in Java

我正在用Java編寫程序來執行許多不同的數學運算和公式,其中之一是矩陣加法。 我需要一種方法來使尺寸由用戶決定。 我可以讓用戶輸入數組的尺寸,但是我想要一種更無縫的方法。 我決定通過鍵入內容來輸入數組的內容,這些內容用逗號分隔不同的行,並用空格分隔不同的數字(3x3數組為1 2 3、4 5 6、7 8 9),這就是代碼i想出了。 (sc是掃描儀)

String[] pr = sc.nextLine().split(", ");
for(int k = 0; k < pr.length; k++){
    String[] pc = pr[k].split(" ");
    for(int j = 0; j < pc.length; k++){
        pt[k][j] = pc[j];
    }
}

該代碼不起作用; 如果運行它,我會收到java.lang.NullPointerException 最初,我正在尋找一種僅通過讀取一個輸入來制作二維數組的方法,例如:

String[][] pt = sc.nextLine().split(", ")(" ");

它會以逗號分隔不同行,並在行內分隔列。 我認為Java中不存在這樣的東西,但是如果這樣做的話,那會很棒。 否則,我將不勝感激。 如果沒有簡便的解決方案,我可能只需要讓用戶鍵入數組尺寸即可。

編輯:如果這不可能,那么如果其他任何人都有一種可以存儲矩陣的有效方法,那就太好了。

我假設您不想使用ArrayList,因為您寧願使用內在函數(double)而不是對象(Double),如果不是這種情況,請使用ArrayList!

如果這是原因,請輸入ArrayList,然后在其填滿后將其轉換為數組。 ArrayList將比您可能編寫的任何代碼都做得更好,並且可讀性更高。

盡管數組通常對於內在函數有意義,但90%的時間我無法弄清人們對數組的迷戀(基於ArrayList)。 即使您希望為操作的特定部分使用數組,通常也最好將其保留為ArrayList 90%的時間,然后在需要時將其轉換為Array。

從評論中的問題開始:數組列表只是一個包裝了一些方法並經過優化的數組。 例如,如果您不需要,就不必給它一個大小,您可以使用:

ArrayList al=new ArrayList();
al.add(0, "first");
al.add(1, "second");

在內部,它將存儲為具有2個字符串的數組。 如果您要求.size()它將顯示2。實際存儲比起初想的要優化一些,但是您只是將其視為一個數組,例如,在上面您可以說:

al.get(1);

並獲得“秒”(就像數組一樣,它們從零開始)。

當您向ArrayList添加更多內容時,它會根據需要擴展其基礎存儲-您無需考慮它。

如果需要,可以隨時將ArrayLists轉換為Arrays。

這是一些“轉化”

// declare
int[] a;
ArrayList<Integer> al;

// Instantiate
a=new int[6];
al=new ArrayList<>(6); // OR al=new ArrayList<>(); and let it expand itself

// add values
a[0]=5;a[1]=6;
al.add(0,5);al.add(1,6); // Note, if the index is greater 
                         // than the list size, the array 
                         // storage inside the list expands automatically

// Retrieve values
x=a[1];
x=al.get(1);

// Overwrite values
a[0]=9;
al.add(0,9);

// find array size:
len=a.length;
len=al.size();

// Iterate over:
for(int i:a) ...
for(int i:al) ... // Yes, identical

主要優點是在eclipse中鍵入al。 您會觸手可及,但可以直接輸入很多非常有用的方法。 您將獲得的收益不多,您必須在Arrays類中查找實用程序方法並摸索自己的方法。 以及ArrayList管理自己大小的方式...

您可能想使用Java 8 Streams API來實現這種二維數組解析。 以下實現草案將字符串解析為二維數組:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Program {
    public static void main(final String[] args) {
        final String arrayString = "1 2 3, 4 5 6, 7 8 9";
        final List<List<Integer>> array = parseArray(arrayString);
        System.out.println(array);
    }

    private static List<List<Integer>> parseArray(final String arrayString) {
        final List<List<Integer>> rows = Arrays.stream(arrayString.split(","))
            .map(Program::parseRow)
            .collect(Collectors.toList());

        final long distinctColumnSizeCount = rows.stream()
            .map(List::size)
            .distinct()
            .count();
        if (distinctColumnSizeCount > 1) {
            throw new IllegalArgumentException("Some rows have different column count");
        }

        return rows;
    }

    private static List<Integer> parseRow(final String rowString) {
        return Arrays.stream(rowString.trim().split("\\s*"))
            .filter(((Predicate<String>) String::isEmpty).negate())
            .map(Integer::valueOf)
            .collect(Collectors.toList());
    }
}

可以使用適當的循環(使用Scanner類逐行讀取)來解析所需數量的二維數組。

希望這可以幫助。

當然,您可以不需要ArrayList來執行此操作,也就是說,如果您更願意堅持填充簡單的2D Array。 坦白地說,我更喜歡使用List對象,但永遠不要少使用2D數組完成所有操作。 方法如下:(以下示例假定您的2D數組列都相同):

如果您希望按照原始問題將2D數組創建為2D字符串數組,請執行以下操作:

String values = "1 2 3, 4 5 6, 7 8 9";
String[] pR = values.split(",");

// Declare and initialize your 2D String Array
String[][] dp = new String[pR.length][pR[0].trim().split("\\s+").length];

// Fill the 2D String Array
for (int i = 0; i < pR.length; i++) {
    String[] pC = pR[i].trim().split("\\s+");
    for (int j = 0; j < pC.length; j++) {
        dp[i][j] = pC[j]; 
    }
}

並在控制台中顯示新的2D字符串數組的內容:

for (int i = 0; i < dp.length; i++) {
            System.out.print("Column Values in Row Index #" + i + " is: --> ");
    for (int j = 0; j < dp[i].length; j++) {
        System.out.print(dp[i][j] + ", ");
    }
    System.out.println("");
}

或簡單地使用: System.out.println(Arrays.deepToString(dp));

如果您希望將2D數組作為整數2D數組,則可以執行以下操作:

String values = "1 2 3, 4 5 6, 7 8 9";
String[] pR = values.split(",");

// Declare and initialize your 2D Integer Array
int[][] dp = new int[pR.length][pR[0].trim().split("\\s+").length];

// Fill the 2D Integer Array
for (int i = 0; i < pR.length; i++) {
    String[] pC = pR[i].trim().split("\\s+");
    for (int j = 0; j < pC.length; j++) {
        dp[i][j] = Integer.parseInt(pC[j]); 
    }
}

當然,您可以使用相同的顯示代碼在控制台中查看2D整數數組的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM