繁体   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