Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按两个条件排序_Java_Algorithm_Sorting_Search - Fatal编程技术网

Java 按两个条件排序

Java 按两个条件排序,java,algorithm,sorting,search,Java,Algorithm,Sorting,Search,我有一个带有字段的n对象数组:ID,price。相同的ID在一个数组中可能出现多次。我想为每个ID找到最便宜的k和不超过m的对象 同时,k m){ 整数poll(); } } }); PriorityQueue priorityQueueK=新的PriorityQueue(k,reverseOrder()); for(优先级队列值:map.values()){ 对于(int i=0;ik){ priorityQueueK.poll(); } } } 最简单的方法是按价格对问题进行排序,然后对其进

我有一个带有字段的n对象数组:ID,price。相同的ID在一个数组中可能出现多次。我想为每个ID找到最便宜的k和不超过m的对象

同时,k m){ 整数poll(); } } }); PriorityQueue priorityQueueK=新的PriorityQueue(k,reverseOrder()); for(优先级队列值:map.values()){ 对于(int i=0;ik){ priorityQueueK.poll(); } } }
最简单的方法是按价格对问题进行排序,然后对其进行迭代,跟踪使用给定ID已选择的问题数量(以便您可以跳过任何超出限制的问题)。选择正确数量的问题后,中止

因此:

Collections.sort(arr,(issueA,issueB)=>Integer.compare(issueA.price,issueB.price));
最终列表结果=新建ArrayList();
final Map countsByID=new HashMap();
用于(最终版本:arr){
如果(!countsByID.containsKey(issue.ID)){
countsByID.put(issue.ID,0);
}
如果(countsByID.get(issue.ID)>=m){
继续;
}
结果:添加(发布);
countsByID.put(issue.ID,countsByID.get(issue.ID)+1);
if(result.size()==k){
返回结果;
}
}
返回结果;//找不到满足限制的k值

您需要一个具有两个条件的比较器

比较器。比较((问题a)->a.ID)按ID创建新的比较器

然后比较添加第二个条件,在本例中,比较价格

list.sort(Comparator.comparing((Issue a)-> a.ID ).thenComparing((a,b)-> Integer.compare(a.price, b.price) ));
我建议使用getter和setter方法

list.sort(Comparator.comparing((Issue a)-> a.getId() ).thenComparing((a,b)-> Integer.compare(a.getPrice(), b.getPrice()) ));

您可以使用优先级队列结构。

对于每个ID,制作一个地图ID->[大小为m的优先级队列],大小为m意味着在已经有m价格的情况下,每次添加价格时都要进行
投票

然后每个ID最多有m个价格,使用此地图并构建另一个[大小为k的优先级队列k],您将解决此问题


复杂性是O(n*log(k))

这是家庭作业吗?您是否尝试过使用自定义的
比较器
?谢谢您的回答。你是认真的吗?我编辑了问题的描述。
PriorityQueue priorityQueueK=newpriorityqueue(k,reverseOrder())
也许在这里,我们不需要告诉它在初始化中的大小是
k
?另外,如果希望最终结果是ID为的价格,则可能需要创建(ID,价格)对象并添加比较器来比较
priorityQueueK
步骤的价格。如果你认为我的回答好的话,你能接受我的回答吗?我希望有15个以上的知名度投票给其他答案:)这几乎不是一个解决方案。我们只需要数组n中的k个对象,相同的ID不超过m个。谢谢你的回答。O()这个解决方案怎么样?@LongMap:O(n logn),因为排序;其余的是O(n)。
new Issue(2, 1),
new Issue(2, 2),
new Issue(3, 4),
new Issue(3, 5),
new Issue(4, 7),
Collections.sort(arr, (issueA, issueB) => Integer.compare(issueA.price, issueB.price));

final List<Issue> result = new ArrayList<>();
final Map<Integer, Integer> countsByID = new HashMap<>();

for (final Issue issue : arr) {
    if (! countsByID.containsKey(issue.ID)) {
        countsByID.put(issue.ID, 0);
    }

    if (countsByID.get(issue.ID) >= m) {
        continue;
    }

    result.add(issue);

    countsByID.put(issue.ID, countsByID.get(issue.ID) + 1);

    if (result.size() == k) {
        return result;
    }
}

return result; // couldn't find k values satisfying the restrictions
list.sort(Comparator.comparing((Issue a)-> a.ID ).thenComparing((a,b)-> Integer.compare(a.price, b.price) ));
list.sort(Comparator.comparing((Issue a)-> a.getId() ).thenComparing((a,b)-> Integer.compare(a.getPrice(), b.getPrice()) ));