Java 如何按计数列对ArrayList输出进行排序

Java 如何按计数列对ArrayList输出进行排序,java,arrays,arraylist,Java,Arrays,Arraylist,我只是尝试按计数对选项卡式输出进行排序,并对所有其他列进行适当排序 int maxNum = A6DiceRolling.diceSides; Scanner sc = new Scanner(System.in); int rollnum; int randomValue; NumberFormat formatter = new DecimalFormat("#0.00"); ArrayList<Integer> numbers = new

我只是尝试按计数对选项卡式输出进行排序,并对所有其他列进行适当排序

int maxNum = A6DiceRolling.diceSides;
    Scanner sc = new Scanner(System.in);
    int rollnum;
    int randomValue;
    NumberFormat formatter = new DecimalFormat("#0.00");
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    ArrayList<Integer> counts = new ArrayList<Integer>();
    //Using ArrayList for my Sum and Counts
    System.out.println("Welcome to the Dice Roll Stats Calculator!");
    System.out.println("Enter amount of rolls: ");
    rollnum = sc.nextInt();
    for (int i = 0; i < rollnum; i++) {
        randomValue = (1 + (int) (Math.random() * maxNum)) + (1 + (int) (Math.random() * maxNum));
        if (numbers.contains(randomValue)) {
            int position = numbers.indexOf(randomValue);
            counts.set(position, counts.get(position) + 1);
        } else {
            numbers.add(randomValue);
            counts.add(1);
        }
    }
    System.out.println("Sum\tCount\tPercentage");
    System.out.println("----\t---\t----------");
    for (int i = 0; i < numbers.size(); i++) {
        System.out.println(numbers.get(i) + "\t" + counts.get(i)
                + "\t" + formatter.format(((double) (counts.get(i) * 100)) / rollnum) + "%");

假设两个列表具有相同的大小,即
编号
计数
-您应该首先使用
集合.sort()
API对
计数
列表进行排序,然后在
计数
列表上迭代,而不是使用
编号

Collections.sort(counts);
for (int i = 0; i < counts.size(); i++) {
System.out.println(numbers.get(i) + "\t" + counts.get(i)
                    + "\t" + formatter.format(((double) (counts.get(i) * 100)) / rollnum) + "%");           
Collections.sort(计数);
对于(int i=0;i
有关如何对列表进行排序以及为什么它不同于集合或映射的进一步阅读,请浏览本帖

如果您可以将数据封装到单个对象中,并在单个
列表中维护,那么就更简单了。曾经的解决方案是制作一个代理
列表
,它可以维护
计数中出现条目的索引
列表
-我正在研究程序员刚才解释的实现,将如果在我完成时没有其他人回答,则发布。如果您正在排序
计数
,但未将更改应用于
数字
,则您已丢失数据顺序。
count.get(I)
可能无法反映
number.get(I)的计数
.Hmm,这对我的列进行了正确的排序,但我的百分比和总和并没有真正按照它进行排序。我收到的输出显示像“蛇眼”一样滚动是最有可能的结果,这在数学上是不可能的。编辑@Obicere Yes这正是发生的事情。在这种情况下,
Map
作为一个底层数据结构,将Number=>Count作为键/值,更有意义pair@PankajGadge我不确定我是否明白,你能给我看一下吗?我想更好的建议是向dr总共操作
数字
。使用1个骰子只有6个可能的结果。使用2个骰子只有12个。使用3个骰子有18个。等等。因此,不需要使用
数字
列表,您只需执行以下操作:
count.get(randomValue-1)
获取反映掷骰子次数的计数。尽管如此,这似乎也是一项分配,而且profs可能会有一些限制。
Collections.sort(counts);
for (int i = 0; i < counts.size(); i++) {
System.out.println(numbers.get(i) + "\t" + counts.get(i)
                    + "\t" + formatter.format(((double) (counts.get(i) * 100)) / rollnum) + "%");