2012-04-09 3 views
3

Я пытаюсь сортировать содержимое массива и, хотя он работает (без ошибок выполнения, выполняет задачи сортировки), первые 10 строк, в то время как отсортированы, не в порядке с остальные строки.Сортировка многомерного массива Java

класс coordSort.java

import java.io.*; 
import java.util.Arrays; 
import java.util.Scanner; 

public class coordSort { 
@SuppressWarnings({ "unchecked", "unused" }) 
public static void main (String args[]) throws IOException { 

    String xCoord, yCoord; 
    int coordSum; 
    Scanner input = new Scanner(System.in); 

    //Get x coordinate from user 
    System.out.print("Enter x coordinate: "); 
    xCoord = input.next(); 

    //Get x coordinate from user 
    System.out.print("Enter y coordinate: "); 
    yCoord = input.next(); 

    boolean sort = false; 

    char[] a = xCoord.toCharArray(); 
    char[] b = yCoord.toCharArray(); 

    //validate user input is a digit 
    if ((Character.isDigit(a[0])) ) {  
     if(Character.isDigit(b[0])){ 
      //digits entered - begin processing all coordinate values 
      sort = true; 
     } 
    } 

    //If validation failed, inform user 
    if(!sort){ 
     System.out.println("Please enter a positive numeric value."); 
    } 

    if(sort){  
     //determine SUM of user entered coordinates 
     coordSum = Integer.parseInt(xCoord) + Integer.parseInt(yCoord); 

     //define coordinate array 
     String[][] coordUnsortedArray = new String[26][3]; 
     int counter; 
     int commaCount; 
     String xCoordIn, yCoordIn; 
     int intXCoordIn, intYCoordIn, sumCoordIn, coordDiff; 

     //define input file 
     FileInputStream fileIn = new FileInputStream("coords.txt"); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(fileIn)); 

     for (int j = 0; j < coordUnsortedArray.length; j++){ 
      counter = 0; 
      commaCount = 0; 
      //line from file to variable 
      String coordSet = reader.readLine();  

      //look for the second "," to determine end of x coordinate 
      for(int k = 0; k < coordSet.length(); k++){ 
       if (coordSet.charAt(k) == ',') { 
        commaCount++; 
        counter++; 
        if (commaCount == 2){ 
         break; 
        } 
       }else{ 
        counter++; 
       } 
      } 

      //define x coordinate 
      xCoordIn = (coordSet.substring(2,(counter - 1))); 
      intXCoordIn = Integer.parseInt(xCoordIn); 

      //define y coordinate 
      yCoordIn = (coordSet.substring((counter),coordSet.length())); 
      intYCoordIn = Integer.parseInt(yCoordIn); 

      //coordinate calculations 
      sumCoordIn = Integer.parseInt(xCoordIn) + Integer.parseInt(yCoordIn); 
      coordDiff = sumCoordIn - coordSum; 

      //load results to array 
      coordUnsortedArray[j][0] = xCoordIn; 
      coordUnsortedArray[j][1] = yCoordIn; 
      coordUnsortedArray[j][2] = Integer.toString(coordDiff); 

      //Output Array (BEFORE SORTING) 
      //System.out.println((j + 1) + ") " + coordUnsortedArray[j][0] + " : " + coordUnsortedArray[j][1] + " : " + coordUnsortedArray[j][2]);     
     }    

     System.out.println("\n"); 

     fileIn.close(); 

     String[][] coordsSorted = new String[26][3]; 

     //Sort array coordDiff, column 3 
     Arrays.sort(coordUnsortedArray, new ColumnComparator(2)); 

     //Print the sorted array 
     for(int i = 0; i < coordUnsortedArray.length; i++){ 
      String[] row = coordUnsortedArray[i]; 
      System.out.print((i + 1) + ") "); 
      for(int j = 0; j < row.length; j++) { 
       //System.out.print(row[j] + " | "); 
       coordsSorted[i][j] = row[j]; 
       System.out.print(coordsSorted[i][j] + " : "); 
      } 
      System.out.print("\n"); 
     } 
    } 
} 
} 

класс sortCoords.java -

import java.util.Comparator; 

@SuppressWarnings("rawtypes") 
class ColumnComparator implements Comparator { 
    int columnToSort; 
    ColumnComparator(int columnToSort) { 
     this.columnToSort = columnToSort; 
    } 
    //overriding compare method 
    public int compare(Object o1, Object o2) { 
     String[] row1 = (String[]) o1; 
     String[] row2 = (String[]) o2; 
     //compare the columns to sort 
     return row1[columnToSort].compareTo(row2[columnToSort]); 
    } 

    //overriding compare method 
    public int compare1(Object o1, Object o2) { 
     String[] row1 = (String[]) o1; 
     String[] row2 = (String[]) o2; 
     //compare the columns to sort 
     return row1[columnToSort].compareTo(row2[columnToSort]); 
    } 
} 

Я пытаюсь сортировать массив в числовом порядке по 3-м столбце. Несортированный массив заполняется текстовым файлом, содержащим что-то вроде:

а, 44,67

б, 31,49

с, 93,6

Я выполняю расчеты на массив по сравнению с пользовательского ввода и заполнение массива следующим образом:

44,67,101

31,49,70

93,6,89

Я хотел бы sortedArray вывести следующее:

31,49,70

93,6,89

44,67,101

+2

Добро - это поможет, если вы могли бы уточнить, как вы хотите их отсортированный и, возможно, выход прямо сейчас, и пример от правильного выхода. – dfb

+0

Привет, спасибо за быстрый ответ. Я пытаюсь сортировать массив в числовом порядке третьим столбцом. Несортированный массив заполняется текстовым файлом, содержащим что-то вроде: a, 44,67 b, 31,49 c, 93,6 Я выполняю вычисления по массиву по сравнению с пользовательским вводом и заполнением массива следующим образом : 44,67,101 31,49,70 93,6,89 Я хотел бы sortedArray вывести следующее: 31,49,70 93,6,89 44,67,101 –

ответ

2

Один из возможных путаниц здесь:

return row1[columnToSort].compareTo(row2[columnToSort]) 

Это сравнение строк, а не числовое. Если вы отсортируете по строкам, вы получите разные результаты, чем если бы вы делали цифры - то есть «1», «10», «100», «9» против 1,9,10,100

Выезд Integer.parseInt и если вы не можете понять остальных, не стесняйтесь задавать больше вопросов.

+0

Пожалуйста, см мой ответ выше. –

+0

Я думаю, что то, что вы написали, соответствует моему ответу, см. Мои правки. – dfb

+0

Мне было интересно, можете ли вы взглянуть на мою ошибку ниже? Я не могу заставить его работать ... Любые мысли, советы или примеры были бы наиболее полезными. Еще раз спасибо за все! –

1

Как указано в описании spinning_plate. Вы должны сравнить их Int значения то вам нужно бросание там

int num1 = Integer.parseInt(row1[columnToSort]); 
    int num2 = Integer.parseInt(row2[columnToSort]); 
    if(num1 > num2) 
      return 1; 
    else 
      return 0; 

Поместите этот код в методе CompareTo и проверить. Поменяйте операторы возврата на сортировку в обратном порядке.

Кроме того, добавление некоторой ошибки в методе compareTo сделает код более эффективным.

+0

Еще раз спасибо за ответы. При вводе: return Integer.parseInt (строка1 [columnToSort]). Integer.parseInt (compareTo (row2 [columnToSort])); У меня есть ошибки под вторым Integer и compareTo Мои извинения, но я новичок в Java ... –

+0

Моя ошибка. Скобки и parseInt были в неправильном месте. Починил это. Пожалуйста, попробуйте и дайте мне знать любую ошибку. – mtk

+0

Теперь вся строка является ошибкой. Ошибка говорит: «Невозможно вызвать compareTo (int) для примитивного типа int». –

0

Хорошо, поэтому после оказания помощи здесь ниже найдено решение, которое мы нашли. Еще раз спасибо за помощь всем! Надеюсь, код ниже поможет кому-то еще.

Код для class1 -

import java.io.*; 
import java.util.Arrays; 
import java.util.Scanner; 

public class coordSort { 
    @SuppressWarnings({ "unchecked" }) 
    public static void main (String args[]) throws IOException { 

     String xCoordChar, yCoordChar; 
     int xCoord, yCoord, coordSum; 
     Scanner input = new Scanner(System.in); 

     //Get x coordinate from user 
     System.out.print("Enter x coordinate: "); 
     xCoordChar = input.next(); 

     //Get x coordinate from user 
     System.out.print("Enter y coordinate: "); 
     yCoordChar = input.next(); 

     boolean sort = false; 

     char[] a = xCoordChar.toCharArray(); 
     char[] b = yCoordChar.toCharArray(); 

     //validate user input is a digit 
     if ((Character.isDigit(a[0])) ) {  
      if(Character.isDigit(b[0])){ 
       //digits entered - begin processing all coordinate values 
       sort = true; 
      } 
     } 

     //If validation failed, inform user 
     if(!sort){ 
      System.out.println("Please enter a positive numeric value."); 
     } 

     if(sort){  
      //Parse user input characters to Integers 
      xCoord = Integer.parseInt(xCoordChar); 
      yCoord = Integer.parseInt(yCoordChar); 

      //determine SUM of user entered coordinates 
      coordSum = xCoord + yCoord; 

      //define coordinate array 
      int[][] coordUnsortedArray = new int[26][3]; 
      int counter; 
      int commaCount; 
      String xCoordIn, yCoordIn; 
      int intXCoordIn, intYCoordIn, sumCoordIn, coordDiff; 

      //define input file 
      FileInputStream fileIn = new FileInputStream("coords.txt"); 
      BufferedReader reader = new BufferedReader(new InputStreamReader (fileIn)); 

      for (int j = 0; j < coordUnsortedArray.length; j++){ 
       counter = 0; 
       commaCount = 0; 
       //line from file to variable 
       String coordSet = reader.readLine();  

       //look for the second "," to determine end of x coordinate 
       for(int k = 0; k < coordSet.length(); k++){ 
        if (coordSet.charAt(k) == ',') { 
         commaCount++; 
         counter++; 
         if (commaCount == 2){ 
          break; 
         } 
        }else{ 
         counter++; 
        } 
       } 

       //define x coordinate 
       xCoordIn = (coordSet.substring(2,(counter - 1))); 
       intXCoordIn = Integer.parseInt(xCoordIn); 

       //define y coordinate 
       yCoordIn = (coordSet.substring((counter),coordSet.length())); 
       intYCoordIn = Integer.parseInt(yCoordIn); 

       //coordinate calculations 
       sumCoordIn = Integer.parseInt(xCoordIn) + Integer.parseInt (yCoordIn); 
       coordDiff = sumCoordIn - coordSum; 

       if (coordDiff < 0){ 
        coordDiff = coordDiff * (-1); 
       } 

       //load results to array 
       coordUnsortedArray[j][0] = intXCoordIn; 
       coordUnsortedArray[j][1] = intYCoordIn; 
       coordUnsortedArray[j][2] = coordDiff;       
      }    

      fileIn.close(); 
      System.out.print("\n"); 
      System.out.println("Array Before Sorting:"); 
      System.out.println("====================="); 

      //Array Before Sorting 
      for(int i = 0; i < coordUnsortedArray.length; i++){ 
       int[] row = coordUnsortedArray[i]; 
       System.out.print((i + 1) + ") "); 
       for(int j = 0; j < (row.length - 1); j++) { 
        coordUnsortedArray[i][j] = row[j]; 
        if(j < 1){ 
         System.out.print(coordUnsortedArray [i] [j] + ","); 
        }else{ 
         System.out.println(coordUnsortedArray [i] [j]); 
        } 
       } 
      } 

      System.out.print("\n"); 
      System.out.print("\n"); 

      //Sort array coordDiff, column 3 
      Arrays.sort(coordUnsortedArray, new ColumnComparator(2)); 

      System.out.println("Array After Sorting:"); 
      System.out.println("===================="); 

      //Original Array After Sorting 
      for(int i = 0; i < coordUnsortedArray.length; i++){ 
       int[] row = coordUnsortedArray[i]; 
       System.out.print((i + 1) + ") "); 
       for(int j = 0; j < (row.length - 1); j++) { 
        coordUnsortedArray[i][j] = row[j]; 
        if(j < 1){ 
         System.out.print(coordUnsortedArray[i][j] + ","); 
        }else{ 
         System.out.println(coordUnsortedArray [i] [j]); 
        } 
       } 
      } 
      } 
     } 
} 

Код для class2 -

import java.util.Comparator; 

@SuppressWarnings("rawtypes") 
class ColumnComparator implements Comparator { 
int columnToSort; 
ColumnComparator(int columnToSort) { 
this.columnToSort = columnToSort; 
} 

//Compare method 
public int compare(Object o1, Object o2) { 
    int[] row1 = (int[]) o1; 
    int[] row2 = (int[]) o2; 

    int intRow1 = (row1[columnToSort]); 
    int intRow2 = (row2[columnToSort]); 

    return new Integer(intRow1).compareTo(new Integer(intRow2)); 
} 
}  
+0

Нет. Этот код не работает в пути вы не планируете и не отображаете значения правильно. –

+0

Я представил редактирование, которое устраняет проблему с выпуском. –

Смежные вопросы