如何在不依赖 java 中的键值的情况下按顺序从树图中获取输出
How to get output from a treemap sequentially without depend upon the key value in java
我有编程问题。我有两个数组。 nums1={1,7,11} 和 nums2={2,4,6}。我必须找出第 k 次从每个数组中取 1 个数字的最小总和。在我的示例中,k=3。所以最小的和是{1+2=3},{1+4=5},{1+6=7}。数组始终按排序顺序排列。
我已经用树图解决了这个问题。
开始吧:
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.When 我打印 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 时,它已经以排序的格式向我显示输出。因此,如果我从树图中获取第 1、2、3 个值,我的问题就会得到解决。但是这里的约束是
value.get() method
搜索元素取决于键值。因此,如果我正在循环从树图中获取 3 个最小值,它会给我空输出,因为键不匹配。
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 个最小的和对。
我有编程问题。我有两个数组。 nums1={1,7,11} 和 nums2={2,4,6}。我必须找出第 k 次从每个数组中取 1 个数字的最小总和。在我的示例中,k=3。所以最小的和是{1+2=3},{1+4=5},{1+6=7}。数组始终按排序顺序排列。
我已经用树图解决了这个问题。
开始吧:
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.When 我打印 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 时,它已经以排序的格式向我显示输出。因此,如果我从树图中获取第 1、2、3 个值,我的问题就会得到解决。但是这里的约束是
value.get() method
搜索元素取决于键值。因此,如果我正在循环从树图中获取 3 个最小值,它会给我空输出,因为键不匹配。
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 个最小的和对。