在java中按总和对输出排序

在java中按总和对输出排序,java,Java,我写了一个程序,从一个有数百组数字(每组有20个数字)的文件中读取数据。 该程序的目的是生成每个集合的和,偶数的和,奇数的和 这是我的密码: public static void main(String args[]) { System.out.println(String.format("%-10s%-10s%-10s", "sum", "even", "odd")); try { FileInputStream fstream =

我写了一个程序,从一个有数百组数字(每组有20个数字)的文件中读取数据。 该程序的目的是生成每个集合的和,偶数的和,奇数的和

这是我的密码:

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

          }
我想要的是对总和进行排序,并得到:

sum   odd   even
120   21    5
404   4     10

为了排序,您必须将计算出的数据存储在某个位置,而不是动态打印。 您可以将它们存储在一个3xn数组中,编写一个比较器,只比较其中的一个维度,然后使用比较器对数组进行排序

例如:

sum   odd   even
404   4     10
120   21     5
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];
    }                     
});
int[]arr=newint[N][3];
//在此处用数据填充arr
sort(arr,新的比较器(){
@凌驾
公共int比较(int[]o1,int[]o2){
返回o1[0]-o2[0];
}                     
});

您的数据需要存储,以便以后可以对其进行排序。最好的方法是设计一个类,负责:

  • 存储数据
  • 分类
  • 维护总和、事件和奇数计数的计数
  • 将自身表示为字符串
这会降低代码的复杂性。这里有一个例子

Sum类:

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

}
公共类和实现可比较
{
私人总收入;
私人帐户;
私人帐户;
公共无效地址编号(int n)
{
sumTotal+=n;
如果((n&0x1)=0x1)
{
oddCount++;
}
其他的
{
evenCount++;
}
}
@凌驾
公共整数比较(和其他)
{
返回整数.compare(sumTotal,other.sumTotal);
}
@凌驾
公共字符串toString()
{
返回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());
    }

}
publicstaticvoidmain(字符串[]args)
{
System.out.println(String.format(“%-10s%-10s%-10s”,“sum”,“偶数”),
"单数);;
尝试
{
//维护的总和列表
List sumList=new ArrayList();
InputStream fstream=新文件InputStream(“data.txt”);
DataInputStream in=新的DataInputStream(fstream);
BufferedReader br=新的BufferedReader(新的InputStreamReader(in));
弦斯特林;
而((strLine=br.readLine())!=null)
{
//准备插入新的总和对象
Sum newSum=新的Sum();
字符串[]numberStrs=strLine.split(“\t”);
for(字符串numberStr:numberStrs)
{
//sum对象管理自己的计数
addNumber(Integer.parseInt(numberStr));
}
//将新对象附加到列表中
sumList.add(newSum);
}
in.close();
//对列表排序
Collections.sort(sumList);
//打印列表
for(总和:sumList)
{
/*
*sum对象负责生成自己的字符串
*代表
*/
系统输出打印项数(总和);
}
}
捕获(例外e)
{
//捕获异常(如果有)
System.err.println(“错误:+e.getMessage());
}
}

您可以拥有一个集合类,在其中保存总和、赔率和偶数。您保存一个集合数组,然后可以按和对其排序(您可以编写一个简单的比较器),然后显示它。

好吧。。。排序,而不是立即打印。如果我将它们放入数组中,我如何只能对和进行排序,并随着和顺序的改变而移动相关的奇数和偶数。但是,我如何只能对和进行排序,并随着和顺序的改变而移动相关的奇数和偶数(改变)