当前位置: 首页 > 知识库问答 >
问题:

Java二维阵列;来自文件输入的可变行和列长度

胥承
2023-03-14

对于这个intro级赋值,我必须从一个文件和一个double[][]a设置一个2D多维数组,并对它们应用几种方法。现在,我主要关心的是初始化数组。我在想办法取一个测试文件,读取第一个int作为行数,每行的第一个整数作为每行的列数,每个double作为数组的成员。

 public class MDArray
    {
        static int rowCount;
        static int columnCount;
        private static double[][] mdarray = new double[rowCount][columnCount];

    public MDArray(double[][] a)
    {
        mdarray = a;
    }

    public MDArray(String file)
    {
        Scanner input = null;
        try
        {
            input = new Scanner(new FileInputStream("ragged.txt"));
        }
        catch (FileNotFoundException e)
        {
            System.out.println("File Not Found.");
            System.exit(0);
        }
        while(input.hasNextDouble())
        {
            rowCount = input.nextInt();
            for(int i = 0; i < rowCount; i++)
            {
                columnCount = input.nextInt();
                for(int j = 0; j < columnCount; j++)
                {
                    double value = input.nextDouble();
                    mdarray[i][j] = value;
                }
            }
        }
    }

    public static boolean isRagged()
    {
        for(int i = 0; i < mdarray.length; i++)
        {
            int rowLength1 = mdarray.length;
            for(int j = i + 1; j < mdarray.length; j++)
            {
                int rowLength2 = mdarray.length;
                if(rowLength1 != rowLength2)
                {
                    return true;
                }
            }
        }
        return false;
    }

    public static int getNumberOfRows()
    {
        int numRows = 0;
        for(int i = 0; i < mdarray.length; i++)
        {
            numRows++;
        }
        return numRows;
    }

    public static int getNumberOfCols()
    {
        int numCols = 0;
        for(int i = 0, j = i + 1; i < mdarray.length; i++)
        {
            for(int k = 0; k < mdarray[i].length; k++)
            {
                if(mdarray[i].length > mdarray[j].length)
                {
                    numCols++;
                }
            }
        }
        return numCols;
    }

    public static double getValAt(int i, int j)
    {
        if(i > mdarray.length || j > mdarray[i].length)
        {
            double invalid = Double.NaN;
            return invalid;
        }
        double valAt = mdarray[i][j];
        return valAt;
    }

    public static void sort(boolean byColumn)
    {
        if(isRagged() == true)
        {
            System.out.println("Ragged arrays cannot be sorted by column.");
        }
        else{
            for(int i = 0; i < mdarray.length; i++)
            {
                for(int j = 0; j < mdarray[i].length; j++)
                {
                    for(int k = j + 1; k < mdarray[i].length; k++)
                    {
                        if(mdarray[i][j] < mdarray[i][k])
                        {
                            double temp = mdarray[i][j];
                            mdarray[i][k] = mdarray[i][j];
                            mdarray[i][j] = temp;
                        }
                    }
                }
            }
        }
    }

    public static int hamming(boolean byColumn)
    {
        int hamVal = 0;
        if(isRagged() == true)
        {
            System.out.println("Ragged arrays cannot be sorted by column.");
        }
        else{
            for(int i = 0; i < mdarray.length; i++)
            {
                for(int j = 0; j < mdarray[i].length; j++)
                {
                    for(int k = j + 1; k < mdarray[i].length; k++)
                    {
                        if(mdarray[i][j] < mdarray[i][k])
                        {
                            double temp = mdarray[i][j];
                            mdarray[i][k] = mdarray[i][j];
                            mdarray[i][j] = temp;
                            hamVal++;
                        }
                    }
                }
            }
        }
        return hamVal;
    }

    public static double[] max()
    {
        double[] maxVal = new double[mdarray.length];
        for(int i = 0, j = i + 1; i < maxVal.length; i++)
            {
                for(int k = 0; k < mdarray[i].length; k++)
                {
                    if(mdarray[i][k] > mdarray[j][k])
                    {
                        maxVal = mdarray[i];
                    }
                }
            }
        return maxVal;
    }

    public String toString()
    {
        String arrayString = "";
        for(int i = 0; i < mdarray.length; i++)
        {
            for(int j = 0; j < mdarray[i].length; j++)
            {
                arrayString += ", " + mdarray[i][j];
            }
            arrayString = arrayString + "/n";
        }
        return arrayString;
    }
}

这是我用来测试MDArray(字符串文件)的文件:

3

2 4.1 8.9

5 9.5 2.0 7.3 2.1 8.9

3 1.3 5.2 3.4

我认为问题是rowcountcolumncount整数没有初始化,但我不确定如何用基本数组技巧将它们初始化为可变长度。这也会影响其他构造函数。作为入门级课程,我不应该使用更高级的技术,如arraylist。此外,我无法验证这些方法是否正确,因为我没有用来测试它们的数组。

编辑:虽然我确实实现了答案中的许多建议,例如将所有内容更改为非静态和其他更改,但我仍然得到一个NullPointerExceptionMDARRAY[I][j]=Input.NextDouble();。我假设它与私有的Double[][]MDARRAY有关,这是赋值规范中所必需的。现在我试图找到一种方法来初始化它,这样它就可以在后面的方法中被重写。

共有1个答案

朱硕
2023-03-14

您必须在构造函数中初始化数组,因为这时您才知道维度:

public MDArray(String file)
{
    Scanner input = null;
    try {
        input = new Scanner(new FileInputStream("ragged.txt"));
    }
    catch (FileNotFoundException e) {
        System.out.println("File Not Found.");
        System.exit(0);
    }
    rowCount = input.nextInt(); 
    mdarray = new double[rowCount][]; // init the array
    for(int i = 0; i < rowCount; i++) {
        columnCount = input.nextInt();
        mdarray[i] = new double[columnCount]; // init the current row
        for(int j = 0; j < columnCount; j++) {
            mdarray[i][j] = input.nextDouble();
        }
    }

}
 类似资料:
  • 我是编程新手,我有一个任务要求从一维数组创建二维数组。我想到了这一点(没有任何外部来源的帮助,因为这会剥夺学习经验)。它适用于我们教授的测试输入,我只是想知道这是一个丑陋/低效的解决方案。 测试输入:twoDArray([1,2,3,4,5],3)输出将是:[[1,2,3],[4,5]]

  • 嘿,伙计们,我已经建立了一个有效的LSTM模型,现在我正在尝试(不成功)添加一个嵌入层作为第一层。 这个解决方案对我不起作用。在提问之前,我还阅读了这些问题:Keras输入解释:输入形状、单位、批次大小、尺寸等,了解Keras LSTM和Keras示例。 我的输入是一种由27个字母组成的语言的字符的单键编码(1和0)。我选择将每个单词表示为10个字符的序列。每个单词的输入大小是(10,27),我有

  • 问题内容: 我试图创建此代码以输入m x n矩阵。我打算输入,但是代码产生了。当我输入其他m×n矩阵时,也会发生相同的情况,代码会产生行数相同的m×n矩阵。 也许您可以帮助我找到我的代码有什么问题。 问题答案: 问题出在初始化步骤上。 这段代码实际上使您的每一行都引用相同的对象。如果任何列中的任何项目发生更改-其他所有列都将发生变化: 您可以在嵌套循环中初始化矩阵,如下所示: 或者,通过使用列表理

  • 为什么上面的代码不起作用,我应该如何纠正?

  • 我试图将一个2d数组中的特定元素添加到另一个数组中,添加的过程是在数组的第一行选择最小的元素,并将该元素添加到同一位置的另一个2d数组中,例如: 2 22 3 5 1 54 7 3 10 20 22 21 这里,第一行中的最小元素是2,所以应该在相同的位置将2添加到另一个2d数组中,对于第二行,1是最小元素,所以我们也将1添加到另一个2d数组中,第三行中的最小元素是3,最后一行,第四行,最小的元素

  • 我正在解决一个程序设计的挑战,在一个2D NxN矩阵中寻找最长的递增子序列的长度。在序列的每个元素中,行和列都必须增加(不需要连续)。本文用动态规划方法求解,但它是O(n^4),效率低。然而,在O(n^3)中有许多解。一种这样的解决办法是: 有人能解释一下它的工作原理或其他O(n^3)方法吗?我根本听不懂:(。