按列读取文本文件并在Java中创建2d数组

时间:2018-12-05 00:21:03

标签: java arrays 2d

如何按列阅读​​以下文本文件,并按列查找成绩数组的最小值? 预先感谢您的帮助。

这是我的文本文件

John  25 5 4.5 5 4 5 10 10 6 9.5 5.5
Jim   25 5 4 5 4.5 5 10 4 10 9.5 7.5
Kathy 15 1 3 2 1 1.5 8 2 4 3 4
Steve 21 5 3 2 1 4 5 6 7 8 8
Stacy 15 5 1 1 1 5 3 8 9 5 7
Faith 16 3 4 2 4 4 7 5 2 3 8

这就是我想要的数组外观

Name = John, Jim, Kathy, Steve, Stacy, Faith
grade1 = 25 25 15 21 15 16
grade2 = 5 5 1 5 5 3
grade3 = 4.5 4 3 3 1 4

以此类推....

这是我的代码

public static void main(String[] arg) throws IOException
{
    PrintWriter writer =  new PrintWriter(new FileOutputStream("Output.txt"));

    double[][] grades = null;

    findMinIndex(grades); //I call the function here just to test out my result before print out to text file.

     writer.println("Min: " + findMinIndex(grades));
     writer.close();
}

//这种读取文件的方法-必须添加此部分,否则页面不会让我保存代码-

public static void processSection(PrintWriter writer, double[][]grades, String[] names) throws IOException
{
{
    Scanner in  = null;

    try
    {
        in = new Scanner(new FileInputStream("input.txt"));         

        //in.nextLine();

          int rows = in.nextInt();
          int columns = in.nextInt();             
          grades = new double[rows][columns];             
          names = new String[grades.length];    
          String[] col = null;

          while(in.hasNextLine()) 
          {     
              for (int i=0; i< grades.length; i++)
              {
                  col = in.nextLine().trim().split("\\s+");     

                  for (int j = 1; j < col.length; j++)                     
                  {                              
                      names[i] = col[0];

                      grades[i][j] = Double.parseDouble(col[j]);

                  }   
              }         
          }  

         in.close();     
    }

    catch(Exception e)
    {

    }

}

//This method to find Min
public static double findMinIndex(double[][] grades) throws FileNotFoundException, IOException 
{       
        double min = grades[0][0];  

        for (int j = 0; j < grades.length; j++) 
        {
            min = Integer.MAX_VALUE;

            for (int i = 1; i < grades[j].length; i++) 
            {                                       
                if (grades[j][i] < min) 
                {                   
                    min = grades[j][i];                      
                }
            }               
        }

        System.out.println(min);
        return min;
}

//The result I got is to calculate the min by the row not by the column.

1 个答案:

答案 0 :(得分:0)

import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.List;
import java.util.Arrays;

class Create2DArray {

    public static void main(String[] arg) throws IOException {
        String[] names = getNames();
        List namesArrayList = Arrays.asList(names);
        String stringNames = namesArrayList.toString()
                .replace("[", "")
                .replace("]", "")
                .trim();         

        double[][] grades = getGrades();

        System.out.println("Name = " + stringNames);

        double rowsum = 0;
        for (int i = 0; i < grades[0].length; i++) {
            System.out.print("grade" + (i+1) + " = ");
            for (int j = 0; j < grades.length; j++) {
                System.out.print(grades[j][i] + " ");
                rowsum += grades[j][i];
            }
            System.out.println("; Row sum = " + rowsum);
            rowsum = 0;
        }
    }

    private static String[] getNames() throws IOException {
        String[] names = null;

        BufferedReader buffer = new BufferedReader(new FileReader("input.txt"));

        String line;
        int row = 0;
        int size = 0;

        BufferedReader reader = new BufferedReader(new FileReader("input.txt"));
        int lines = 0;
        while (reader.readLine() != null) lines++;
        reader.close();

        while ((line = buffer.readLine()) != null) {
            String name = line.trim().split("\\s+")[0];

            if (names == null) {
                size = lines;
                names = new String[size];
            }

            names[row] = name;
            row++;
        }
        return names;
    }

    private static double[][] getGrades() throws IOException {
        double[][] matrix = null;

        BufferedReader buffer = new BufferedReader(new FileReader("input.txt"));

        String line;
        int nrows = 0;
        int row = 0;
        int ncols = 0;

        while (buffer.readLine() != null) nrows++;
        buffer.close();

        BufferedReader reader = new BufferedReader(new FileReader("input.txt"));

        while ((line = reader.readLine()) != null) {
            String[] vals = line.trim().split("\\s+");
            ncols = vals.length-1;

            if (matrix == null) {
                matrix = new double[nrows][ncols];
            }

            for (int col = 1; col <= ncols; col++) {
                try {
                    matrix[row][col-1] = Double.parseDouble(vals[col]);
                }
                catch (NumberFormatException e) {}
            }
            row++;
        }
        reader.close();
        return matrix;
    }
}

输出:

Name = John, Jim, Kathy, Steve, Stacy, Faith
grade1 = 25.0 25.0 15.0 21.0 15.0 16.0 ; Row sum = 117.0
grade2 = 5.0 5.0 1.0 5.0 5.0 3.0 ; Row sum = 24.0
grade3 = 4.5 4.0 3.0 3.0 1.0 4.0 ; Row sum = 19.5
grade4 = 5.0 5.0 2.0 2.0 1.0 2.0 ; Row sum = 17.0
grade5 = 4.0 4.5 1.0 1.0 1.0 4.0 ; Row sum = 15.5
grade6 = 5.0 5.0 1.5 4.0 5.0 4.0 ; Row sum = 24.5
grade7 = 10.0 10.0 8.0 5.0 3.0 7.0 ; Row sum = 43.0
grade8 = 10.0 4.0 2.0 6.0 8.0 5.0 ; Row sum = 35.0
grade9 = 6.0 10.0 4.0 7.0 9.0 2.0 ; Row sum = 38.0
grade10 = 9.5 9.5 3.0 8.0 5.0 3.0 ; Row sum = 38.0
grade11 = 5.5 7.5 4.0 8.0 7.0 8.0 ; Row sum = 40.0