Java 2D阵列;变量和变量文件输入的列长度

时间:2016-12-06 08:21:15

标签: java arrays

对于这个介绍级别的赋值,我必须从文件和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(String文件)的文件:

  

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有关,这在分配规范中是必需的。现在我试图找到一种方法来初始化它,以便它可以在后面的方法中被覆盖。

3 个答案:

答案 0 :(得分:1)

您必须在构造函数中初始化数组,因为那时您知道尺寸:

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();
        }
    }

}

答案 1 :(得分:1)

您可以通过在多维数组的前2行放置行数和列数来初始化数组,如果我有10行12列我可以这样做:

    public void arrayStuff() {
    File fileToRead = new File("YOUR LINK HERE");
    String[][] data;


    try (BufferedReader reader = new BufferedReader(new FileReader(fileToRead))) {

        String line;
        data = new String[Integer.parseInt(reader.readLine())][Integer.parseInt(reader.readLine())];
        while((line = reader.readLine()) != null) {
            // read the rest here..
        }


    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我正在使用AutoCloseable(这就是为什么尝试是在这些()之间进行的,但这样我以后就不必关闭它了。

基本上,首先我读取有的行数,然后是列数,所以如果我有这个文件:

10
12
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j
a b c d e f g h i j

它能够读取所有这些内容,因为行和列的数量是在文件中定义的。

答案 2 :(得分:1)

您没有使用字段rowCount和columnCount:您可以删除它们

mdarray字段应该是非静态的,因此应该是使用它们的方法(如果它是一个实用程序类,你就不会有任何构造函数)

可以在读取文件时创建数组:

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

方法getNumberOfRows()和getNumberOfCols()计数要简单得多:

public int getNumberOfRows()
{
    return mdarray.length;
}

public int getNumberOfCols() {
    int result = 0;
    for (double[] col: mdarray) {
        if (col.length > result) {
            result = col.length;
        }
    }
    return result;
}

在getValueAt()中,测试错误;它应该是:

if(i >= mdarray.length || j >= mdarray[i].length)