我遇到了类似以下问题,需要在java中实现。
item view Hit Quality(%)
1 20 6 55
2 18 8 67
3 16 7 70
4 13 9 80
5 17 8 85
.. .. .. ..
我这里有以上格式的数据。
我必须只选择视图总和,命中总和和质量平均值最高的那些行。
这是上面的第一个问题,第二个是额外的,就像我们对视图总数提到的最小限制,命中总数和总质量的平均值,如view = 100,hit = 30和quality = 70%。这里的主要因素是视图,次要因素是命中,第三个因素是质量。所以现在再次我们必须为这些最高值选择行,但要注意视图和命中的总和不应小于限制。如果没有达到极限的情况,那么我们可以继续进行而不关心它。
答案 0 :(得分:0)
使用以下代码对结果进行排序:
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Item {
private int view;
private int hit;
private double quality;
public int getView() {
return view;
}
public void setView(int view) {
this.view = view;
}
public int getHit() {
return hit;
}
public void setHit(int hit) {
this.hit = hit;
}
public double getQuality() {
return quality;
}
public void setQuality(double quality) {
this.quality = quality;
}
}
class ExecuteTest{
public void sort(List<Item> itemList){
Collections.sort(itemList, new Comparator<Item>() {
@Override
public int compare(Item item1, Item item2) {
boolean checkView = true, checkHit = true;
if(item1.getView() == item2.getView()){
checkView = false;
}
if(item1.getHit() == item2.getHit()){
checkHit = false;
}
if(item1.getView() <=100 && item1.getHit() <= 30 && item1.getQuality() <= 70
&&
item2.getView() <=100 && item2.getHit() <= 30 && item2.getQuality() <= 70
){
if(checkView && item1.getView() > item2.getView()){
return 1;
}else if(checkView && item1.getView() < item2.getView()){
return -1;
}
else if(checkHit && item1.getHit() > item2.getHit()){
return 1;
}else if(checkHit && item1.getHit() < item2.getHit()){
return -1;
} else if(item1.getQuality() > item2.getQuality()){
return 1;
} else if(item1.getQuality() < item2.getQuality()){
return -1 ;
} else{
return 0;
}
}
return 0;
}
});
}
}