Почему я не могу вернуть массив с плавающей точкой из функции в основной класс? - PullRequest
0 голосов
/ 25 марта 2012

Это dbConnection.java, который возвращает двумерную матрицу с плавающей точкой.

   public float [][] connectToDB() throws Exception {

   Class.forName("com.mysql.jdbc.Driver").newInstance();

   // Load the database details into the variables.
   String dbUrl = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dataBase;
   dbString = dbUrl;
   try {
       // Create the database connection, if it is closed.
       if ((conn == null) || conn.isClosed()){
          conn = DriverManager.getConnection(dbString, dbUsername, dbPassword);
          Statement st = null;
          ResultSet rs = null;
          st = conn.createStatement();
          String query = "select * from Placement";
          rs = st.executeQuery(query);
          ResultSetMetaData rsmd = rs.getMetaData();
          int numCols = rsmd.getColumnCount();

          while (rs.next()) {
              float cg = rs.getFloat(1);
              float m  = rs.getFloat(2);
              float a  = rs.getFloat(3);

              if ((cg > 7.0 && cg <= 9.0) && (m > 75 && m <= 90) && (a > 75 && a <= 90)){
                  CGPA.add(cg);
                  Marks.add(m);
                  Attendance.add(a);
              }
          }

          Float[] cgpa       = CGPA.toArray(new Float[0]);
          Float[] marks      = Marks.toArray(new Float[0]); //After elgibility .... Marks are of highest weight
          Float[] attendance = Attendance.toArray(new Float[0]);

          int lengthCgpa       = cgpa.length;
          int lengthMarks      = marks.length;
          int lengthAttendance = marks.length;

          float [][] distMatrixCgpa       = new float [lengthCgpa][lengthCgpa];
          float [][] distMatrixMarks      = new float [lengthMarks][lengthMarks];
          float [][] distMatrixAttendance = new float [lengthAttendance][lengthAttendance];
          float [][] distMatrixAverage    = new float [lengthAttendance][lengthAttendance];

          for (int r = 0; r < lengthCgpa; ++r) {
              for (int c = 0; c < lengthCgpa; ++c ){
                  distMatrixCgpa [r][c] = calcDistance(cgpa[r], cgpa[c]);
              }
          }
          for (int r = 0; r < lengthMarks; ++r) {
              for (int c = 0; c < lengthMarks; ++c ){
                  distMatrixMarks [r][c] = calcDistance(marks[r], marks[c]);
              }
          }
          for (int r = 0; r < lengthAttendance; ++r) {
              for (int c = 0; c < lengthAttendance; ++c ){
                  distMatrixAttendance [r][c] = calcDistance(attendance[r], attendance[c]);
              }
          }
          for (int r = 0; r < lengthAttendance; ++r) {
              for (int c = 0; c < lengthAttendance; ++c ){
                  distMatrixAverage [r][c] = (distMatrixCgpa [r][c]
                                                + distMatrixMarks [r][c]
                                                    + distMatrixAttendance [r][c])/3;
              }
          }
          *****//This prints the correct float matrix but finally the function
          //returns a null matrix! :(
          distMatrixFormatted = new float [lengthCgpa][lengthCgpa];
          for (int r = 0; r < lengthCgpa; ++r) {
              for (int c = 0; c < lengthCgpa; ++c ) {
                  DecimalFormat df = new DecimalFormat("#.##");
                  distMatrixFormatted [r][c] = Float.valueOf(df.format(distMatrixAverage [r][c]));
                  System.out.print(distMatrixFormatted [r][c] + " ");
              }
              System.out.print("\n");
          }*****

          rs.close();
          st.close();
       }
   } catch (SQLException sqlex) {
           System.out.println("SQLException while connecting and inserting into " +
                             "the database table: " + sqlex.toString());
     } catch (Exception ex) {
           System.out.println("Exception while connecting and inserting into the" +
                              " database table: " + ex.toString());
           ex.printStackTrace();
     } finally {
           // Close the Statement and the connection objects.
           if (conn != null)
               conn.close();
     }
     return distMatrixFormatted;
}

Когда я вызываю вышеуказанную функцию в main (), она возвращает нулевую матрицу ..... (Agnes.java)

public static void main(String args[]) throws Exception {
            try{
                dbConnection P = new dbConnection();
                float ad[][] = P.connectToDB();
                int length = ad.length;
                double [][] Array = new double [ad.length][ad.length];

                ReadDistance readdistance = new ReadDistance();
                Array = readdistance.read(length, Array);

                *****
                //Converting Float Matrix to Double! 
                //This produces Null matrix !!!!
                for (int i = 0 ; i < Array.length ; ++i) {
                    for (int j = 0 ; j < Array.length; ++j) {
                        Array[i][j] = (double) Array[i][j];
                        System.out.print(Array[i][j] + " ");
                    }
                    System.out.print("\n");
                }*****

                Agnes agnes = new Agnes(Array, "single");
                agnes.run();
            } catch (Exception e){
                e.printStackTrace();
            }
        }

Что я должен сделать, чтобы получить правильную матрицу с плавающей точкой в ​​основной функции?

Пожалуйста, помогите!

PS: оба являются только фрагментами кода

1 Ответ

1 голос
/ 25 марта 2012

Я считаю, что это проблема:

 Array[i][j] = (double) Array[i][j];

Чего вы ожидали , чего ожидали ? Я подозреваю, что вы имели в виду:

 Array[i][j] = ad[i][j];

Но в этом случае вы вообще не будете использовать предыдущие значения Array ... вы, похоже, создаете два "полезных" массива данных в этих двух строках:

float ad[][] = P.connectToDB();
Array = readdistance.read(length, Array);

... но потом вы копируете одно в другое. Зачем? Почему вы не используете оба?

(Кроме того, я настоятельно призываю вас пересмотреть свое именование переменных, а также рефакторировать connectToDb в более короткий метод. Возможно, вы также захотите назвать его чем-то другим, поскольку он явно делает больше, чем просто подключение к базе данных ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...