有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据两个数组的值对数组进行排序

我目前有两个阵列,电源和能源:

int[] power = [20, 10, 50, 10, 30, 5];
powerIndex     0   1   2   3   4   5
int[] energy = [20, 5, 15, 3, 10, 30];
energyIndex    0   1   2   3   4   5

我想得到一个数组,其中幂数组的索引被排序(从低到高),如果幂数相同,那么使用较少能量的幂应该得到第一个点。所以基本上我想要的结果是:

int[] result = [5, 3, 1, 0, 4, 2]

这是我目前的代码:

        int[] result = new int[power.length];
        int answerIndex = 0;
        int tempSmallest = Integer.MAX_VALUE;
        int lastNumberSaved = 0;
        int posWithSmallerPower = 0;


        while (answerIndex < power.length) {

            for (int i = 0; i < power.length; i++) {
                int current = power[i];
                if (tempSmallest > current && current > lastNumberSaved) {
                    tempSmallest = current;
                    posWithSmallerPower = i;
                }

                if (tempSmallest >= current && current > lastNumberSaved) {
                    if (current != lastNumberSaved && energy[posWithSmallerPower] > energy[i]) {
                        tempSmallest = current;
                        posWithSmallerPower = i;
                    }
                }
            }
            answer[answerIndex] = posWithSmallerPower;
            answerIndex++;
            lastNumberSaved = tempSmallest;
            tempSmallest = Integer.MAX_VALUE;
        }

        return answer;

我得到的:[5,3,0,4,2,2]。 再说一遍,我应该得到的:[5,3,1,0,4,2]

我在处理相同数字的异能时遇到了麻烦。我确实在第二个数组中比较了它们的能量,实际上我首先得到了索引3中的幂,但是代码完全忽略了同样有相同数字(10)的第二个幂

我如何做到这一点?谢谢!


共 (2) 个答案

  1. # 1 楼答案

    list.sort()中使用内联Comparator<T>来比较两个powerEnergyIndex

    import java.util.ArrayList;
    import java.util.List;
    
    public class MainApplication {
        public static void main(String[] args) {
            int[] power = {20, 10, 50, 10, 30, 5};
    
            int[] energy = {20, 5, 15, 3, 10, 30};
    
            List<PowerEnergyIndex> powerEnergyIndices = new ArrayList<>();
    
            for(int i=0;i<power.length;i++) {
                powerEnergyIndices.add(new PowerEnergyIndex(power[i],energy[i],i));
            }
    
            powerEnergyIndices.sort((p1, p2)-> {
                if(p1.power!=p2.power) {
                    return p1.power-p2.power;
                }
                return p1.energy-p2.energy;
            });
    
            int[] result = powerEnergyIndices.stream()
                                                .map(powerEnergyIndex -> powerEnergyIndex.index)
                                                .mapToInt(x->x)
                                                .toArray();
    
            for(int i:result) {
                System.out.print(i + " ");
            }
    
    
    
        }
    
        static class PowerEnergyIndex {
            private int power;
            private int energy;
            private int index;
    
            public PowerEnergyIndex(final int power, final int energy, final int index) {
                this.power = power;
                this.energy = energy;
                this.index = index;
            }
        }
    }
    

    哪个输出 5 3 1 0 4 2

  2. # 2 楼答案

    对于实现Comparable接口的临时数据结构来说,这似乎是一个很好的用例。{a1}解释了这是如何很好地工作的,但这是一个例子:

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public final class Main {
    
        private static class Entry implements Comparable<Entry> {
            private final int power;
            private final int energy;
            private final int index;
    
            public Entry(int power, int energy, int index) {
                this.power = power;
                this.energy = energy;
                this.index = index;
            }
    
            @Override
            public int compareTo(Entry o) {
                if (this.power != o.power) {
                    return this.power - o.power;
                }
                return this.energy - o.energy;
            }
        }
    
        public static void main(String[] args) {
            int[] power = {20, 10, 50, 10, 30, 5};
            int[] energy = {20, 5, 15, 3, 10, 30};
    
            List<Entry> entries = new ArrayList<>();
            for (int i = 0; i < power.length; i++) {
                entries.add(new Entry(power[i], energy[i], i));
            }
    
            Collections.sort(entries);
            List<Integer> result = entries.stream()
                    .map(entry -> entry.index)
                    .collect(Collectors.toList());
            System.out.println(result);
        }
    }
    

    哪些输出:

    [5, 3, 1, 0, 4, 2]