java - 如何在不依赖java中的键值的情况下顺序从树形图中获取输出

标签 java arrays sorting treemap

我遇到编程问题。我有两个数组。 nums1={1,7,11} 和 nums2={2,4,6}。我必须找出每个数组中第 k 次取 1 个数字的最小总和。在我的例子中,k=3。所以最小的和是 {1+2=3},{1+4=5},{1+6=7}。数组始终按排序顺序排列。

我已经使用Treemap来解决这个问题。

我们开始:

public List<int[]> kSmallestPairs(int[] nums1, int[] nums2, int k) {
     Map<Integer,int[]> value=new TreeMap<>();
     int[]arr_hold=new int[2];
     int []solve_arr=new int[k];
     List<int[]> solve = new ArrayList<>();
     ArrayList<Integer>add_sum= new ArrayList<>();
     int sum=0;
     for(int i=0;i<nums1.length;i++){
         for(int j=0;j<nums2.length;j++){
             sum=nums1[i]+nums2[j];
             arr_hold[0]=nums1[i];
             arr_hold[1]=nums2[j];
             value.put(sum,arr_hold);
         }
     }


     return solve;
 }

问题: 1.当我打印System.out.println(value); 输出:

{3=[I@75412c2f, 5=[I@75412c2f, 7=[I@75412c2f, 9=[I@75412c2f, 11=[I@75412c2f, 13=[I@75412c2f, 15=[I@75412c2f, 17=[I@75412c2f}

现在为什么数组arr_hold的值没有正确显示?

当我使用树形图时,它已经以排序的格式显示了输出。因此,如果我从 TreeMap 中获取第一个、第二个、第三个值,我的问题就会得到解决。但这里的约束是

 value.get() method

搜索元素取决于键值。因此,如果我使用循环从树形图中获取 3 个最小值,它会因为键不匹配而给出 null 输出。

 for(int k1=0;k1<k;k1++){
         System.out.println(value.get(k1));
     }

输出:空

     null

     null 

我如何以我的方式解决我的问题?

最佳答案

这个怎么样:

import java.util.ArrayList;
import java.util.List;

public class KSmallestPairs {
    public static void main(String[] args) {
        System.out.println(kSmallestPairs(new int[]{1,7,11}, new int[]{2,4,6}, 3));
    }

    public static List<SumPair> kSmallestPairs(int[] leftInts, int[] rightInts, int k) {
        if (k < 1) {
            throw new IllegalArgumentException("k (=" + k + ") must higher than 0!");
        } else if (leftInts.length * rightInts.length < k) {
            throw new IllegalArgumentException("k (=" + k
                    + ") cannot be higher than the length of the cartesian product (="
                    + leftInts.length * rightInts.length + ")");
        }

        final List<SumPair> sumPairs = new ArrayList<>();
        int minLeftIndex = 0;
        int minRightIndex = 0;
        for (int leftIndex = 0, rightIndex = 0;
             leftIndex < leftInts.length
                     && rightIndex < rightInts.length
                     && sumPairs.size() < k; ) {            
            final int leftInt = leftInts[leftIndex];
            final int rightInt = rightInts[rightIndex];
            sumPairs.add(new SumPair(leftInt, rightInt));

            if(leftIndex + 1 < leftInts.length && rightIndex + 1 < rightInts.length) {
                final int nextLeftInt = leftInts[leftIndex + 1];
                final int nextRightInt = rightInts[rightIndex + 1];
                final int sumOfLeftIntAndNextRightInt = leftInt + nextRightInt;
                final int sumOfNextLeftIntAndRightInt = nextLeftInt + rightInt;
                if(sumOfLeftIntAndNextRightInt < sumOfNextLeftIntAndRightInt) {
                    rightIndex++;
                } else {
                    leftIndex++;
                }
            } else if(leftIndex + 1 < leftInts.length) {
                leftIndex++;
                rightIndex = minRightIndex;
                minLeftIndex++;
            } else if(rightIndex + 1 < rightInts.length) {
                leftIndex = minLeftIndex;
                rightIndex++;
                minRightIndex++;
            }
        }
        return sumPairs;
    }

    static class SumPair {
        private final int leftInt;
        private final int rightInt;

        public SumPair(int leftInt, int rightInt) {
            this.leftInt = leftInt;
            this.rightInt = rightInt;
        }

        public int getLeftInt() {
            return leftInt;
        }

        public int getRightInt() {
            return rightInt;
        }

        public int getSum() {
            return leftInt + rightInt;
        }

        @Override
        public String toString() {
            return leftInt + "+" + rightInt + "="+ getSum();
        }
    }
}

输出:

[1+2=3, 1+4=5, 1+6=7, 7+2=9]

它急切地找到 k 个最小的和对。

关于java - 如何在不依赖java中的键值的情况下顺序从树形图中获取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54268688/

相关文章:

java - 将两个数组合并为一个按升序排列的数组无法正常工作。 java

java - 如何从 Observable<List<Type>> 创建 Observable<Type>

java - Swing JTextField 文本更改监听器 DocumentListener 无限循环

c++ - 递归可迭代模板函数 C++

php - php 在使用指定键直接访问数组行时的性能是什么

通过交换第一个整数在排列之间移动的算法

java - 在单元测试方法中模拟文件、文件编写器和 csvwriter 抛出 NullPointerException

java - 为什么我不能将 Scala 的 Function1 隐式转换为 java.util.function.Function?

python - Numpy:如何用一维数组索引二维数组?

.net - 反转 ListBox 项目(按 "nothing"降序排序)