2014-01-12 6 views
0

Я написал программу, которая читает из файла, который содержит сотни наборов чисел (каждый набор содержит 20 номеров). точкой программы является получение суммы каждого набора, # четного, # нечетного.сортировать вывод по сумме в java

вот мой код:

public static void main(String args[]) 
{ 


    System.out.println(String.format("%-10s%-10s%-10s", "sum", "even", "odd"));  
    try 
    { 

      FileInputStream fstream = new FileInputStream("data.txt"); 
      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
      String strLine; 
      while ((strLine = br.readLine()) != null) { 
       String[] numberStrs = strLine.split("\t"); 
       int[] numbers = new int[numberStrs.length]; 

       for(int i = 0;i < numberStrs.length;i++) 
       { 
        numbers[i] = Integer.parseInt(numberStrs[i]); 
        //System.out.println(numbers[i]); 
       } 
       int sumTotal = sum(numbers); 
       for (int j =0; j<numbers.length;j++) 
       { 
        if (isEven(numbers[j]) == true) 
        { 
         evenCounter++; 
        } 
        else 
        { 
         oddCounter++; 
        } 

       } 
       System.out.println(String.format("%-10s%-10s%-10s", sumTotal, evenCounter, oddCounter + "\n"); 
       } 
       in.close(); 

    }catch (Exception e){//Catch exception if any 
      System.err.println("Error: " + e.getMessage()); 
      } 

      } 

теперь выход сотни строк и 3 столбцов (сумма, четный, нечетный). мой вопрос в том, как сортировать вывод по сумме (четный и нечетный связаны с суммой).

, например:

sum odd even 
404 4  10 
120 21  5 

Я хочу, чтобы отсортировать сумму и есть:

sum odd even 
120 21 5 
404 4  10 
+1

Ну ... Сортируйте его вместо немедленной печати. –

+0

, если я помещаю их в массив, как я могу только сортировать сумму и перемещать связанные нечетные и даже при изменении порядка сумм. – user3188039

ответ

1

Ваши данные должны быть сохранены, поэтому он может быть отсортирован позже. Лучший способ сделать это, чтобы создать класс, который отвечает за:

  • Хранение данных
  • Сортировка
  • Поддержание бирку суммы и событий & нечетных отсчетов
  • выступающее в виде строки

Это приводит к некоторой сложности из вашего кода. Вот пример.

Класс Сумма:

public class Sum implements Comparable<Sum> 
{ 
    private int sumTotal; 
    private int evenCount; 
    private int oddCount; 

    public void addNumber(int n) 
    { 
     sumTotal += n; 
     if ((n & 0x1) == 0x1) 
     { 
      oddCount++; 
     } 
     else 
     { 
      evenCount++; 
     } 
    } 

    @Override 
    public int compareTo(Sum other) 
    { 
     return Integer.compare(sumTotal, other.sumTotal); 
    } 

    @Override 
    public String toString() 
    { 
     return String.format("%-10s%-10s%-10s", sumTotal, evenCount, oddCount); 
    } 

} 

И ваш пересмотренный код:

public static void main(String[] args) 
{ 
    System.out.println(String.format("%-10s%-10s%-10s", "sum", "even", 
      "odd")); 
    try 
    { 
     // The maintained sum list 
     List<Sum> sumList = new ArrayList<Sum>(); 
     InputStream fstream = new FileInputStream("data.txt"); 
     DataInputStream in = new DataInputStream(fstream); 
     BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
     String strLine; 
     while ((strLine = br.readLine()) != null) 
     { 
      // Prepare to insert a new sum object 
      Sum newSum = new Sum(); 
      String[] numberStrs = strLine.split("\t"); 
      for (String numberStr : numberStrs) 
      { 
       // The sum object manages its own tallies 
       newSum.addNumber(Integer.parseInt(numberStr)); 
      } 
      // Append the new object to the list 
      sumList.add(newSum); 
     } 
     in.close(); 
     // Sort the list 
     Collections.sort(sumList); 

     // Print the list 
     for (Sum sum : sumList) 
     { 
      /* 
      * The sum object is responsible for generating its own string 
      * representation 
      */ 
      System.out.println(sum); 

     } 
    } 
    catch (Exception e) 
    { 
     // Catch exception if any 
     System.err.println("Error: " + e.getMessage()); 
    } 

} 
+0

, спасибо, это отлично работает для меня. – user3188039

0

Для того, чтобы отсортировать, вам придется хранить расчетные данные где-то вместо его печати на лету. Вы можете сохранить их в массиве 3 x N, написать Comparator, который сравнивает только одно измерение, а затем сортирует массив с вашим компаратором.

, например:

int[][] arr = new int[N][3]; 

// populate arr with data here 

Arrays.sort(arr, new Comparator<int[]>(){ 
    @Override 
    public int compare(int[] o1, int[] o2) {  
     return o1[0] - o2[0]; 
    }      
}); 
+0

, но как я могу сортировать только сумму и перемещать связанные нечетные и даже при перемещении суммы (изменение) – user3188039

+0

Я обновил свой ответ на примере –

0

Вы могли бы иметь класс Set, где вы сохраните сумму, количество шансов и эвенов. Вы сохраняете массив Set, а затем можете сортировать его по сумме (вы можете написать простой Comparator), а затем отобразить его.

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