选择每列上具有多个条件的行

时间:2014-05-28 09:12:37

标签: java algorithm

我遇到了类似以下问题,需要在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%。这里的主要因素是视图,次要因素是命中,第三个因素是质量。所以现在再次我们必须为这些最高值选择行,但要注意视图和命中的总和不应小于限制。如果没有达到极限的情况,那么我们可以继续进行而不关心它。

1 个答案:

答案 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;
            }
        });

    }

}