3

我有一个国家代码值列表(可以重复)和相应的价格,如主类中所示,我想以这种方式找到最大值/最小值:

如果 Country Code = 0.1 ,我应该从 0.90、0.91、0.92 中得到最高价格 = 0.92。对于所有其他国家/地区代码,依此类推,即我想为每个不同的国家/地区代码查找最高价格

我已经在下面显示的代码中成功完成了它。但这是非常缓慢且不是好方法。

我的方法:由于“Class Main”中的数据是相关的(国家代码,价格),我首先使用带 Comparator 的“Telephone”类按国家代码对数据进行排序,然后扫描“Telephone-ArrayList”的所有元素“然后我通过比较 ArrayList 元素找到每个“不同”国家代码的最大值。

class Telephone implements Comparator<Telephone>{
    private int countryCode; 
    private double price;

    Telephone(){
    }

    Telephone( int c, double p){
        countryCode= c;
        price= p;

    }

    public int getCountryCode(){
        return countryCode;
    }

    public double getPrice(){
        return price;
    }


    // Overriding the compare method to sort
    public int compare(Telephone d, Telephone d1){

        return d.getCountryCode() - d1.getCountryCode();    
    }

}


public class Main {                          
    /**                                     
    * @param args
    */
    public static void main(String[] args) {
        // Takes a list o Telephone objects
        ArrayList <Telephone> list = new ArrayList<Telephone>(); 
        ArrayList <Double> arr = new ArrayList<Double>(); 
        list.add(new Telephone(1, 0.9));
        list.add(new Telephone(268, 5.1 ));
        list.add(new Telephone(46, 0.17 ));
        list.add(new Telephone(46, 0.01));
        list.add(new Telephone(4631, 0.15 ));
        list.add(new Telephone(4620, 0.0 ));
        list.add(new Telephone(468, 0.15 ));
        list.add(new Telephone(46, 0.02));
        list.add(new Telephone(4673, 0.9));
        list.add(new Telephone(46732,1.1));



        list.add(new Telephone(1, 0.91 ));
        list.add(new Telephone(44, 0.4 ));
        list.add(new Telephone(92, 0.4 ));
        list.add(new Telephone(467, 0.2 ));
        list.add(new Telephone(4, 0.0001 ));

        list.add(new Telephone(1, 0.92 ));
        list.add(new Telephone(44, 0.5 ));

        list.add(new Telephone(467, 1.0 ));
        list.add(new Telephone(48, 1.2 ));
        list.add(new Telephone(4, 0.1));

        Collections.sort(list, new Telephone());

        for ( int i=0; i < list.size()-1; i++)
        {

            arr.clear();

            while ( list.get(i).getCountryCode()== list.get(i+1).getCountryCode())
            {

              arr.add(list.get(i).getPrice()) ;
              i=i+1;

            }
            arr.add(list.get(i).getPrice());

            arr.trimToSize();

            System.out.println( " Max value is " + Collections.max(arr).toString() + " for " +list.get(i).getCountryCode());
        }
    }   
}
4

4 回答 4

2

您可以在不预先进行任何排序的情况下执行此操作,因此您唯一的成本将是对集合的一次迭代和哈希映射的插入时间。

Collection<Telephone> list = ...;

Map<Integer, Double> maximumPrices = new HashMap<Integer, Double>();

for(Telephone telephone : list) {
    Double checkPrice = maximumPrices.get(telephone.getCountryCode());
    if(checkPrice == null || checkPrice < telephone.getPrice()) {
        maximumPrices.put(telephone.getCountryCode(), telephone.getPrice());
    }
}

我将把添加对记录最低价格的支持作为练习留给你。

于 2013-01-26T13:48:18.210 回答
2

你可以让Telephone实施Comparable,如果国家代码相等,你可以计算你的价格进行比较。如果您对列表进行排序,您将首先按 contrycode 排序,然后按价格排序。

然后,您可以遍历您的电话集合并为每次交互保留 contrycode。您迭代的国家代码的最后一个元素将是价格最高的元素。这样您就可以一步完成国家代码比较和价格比较。

 public int compareTo(Telephone d){
    int cc1 = this.getCountryCode();
    int cc2 = d.getCountryCode();

    if(cc1 == cc2){
      double price1 = this.getPrice();
      double price2 = d.getPrice();          
      if(price1 < price2)
         return -1;
      if(price1 > price2)
         return 1;
      return 0;
    }

    return cc1 - cc2;    
 }
于 2013-01-26T13:55:01.353 回答
2

我认为最好的实施取决于你所追求的。

a)如果您有一组或多或少是经常被调用的静态电话,您应该在添加新电话时尝试设置最小值,最大值。

b)如果您经常添加电话,则仅在需要时才应获得最小最大值。

a)您可以使用 HashMap ,其中键是国家/地区代码。

 HashMap<Integer,ArrayList<float>> telefonMap = new HashMap<Integer,ArrayList<float>();
 addtelephone(int coutrycode, float price ){
  if (telefonMap.contains(countrycode){
     telefonMap.get(contrycode).add(price);
     // if you have frequent min max requests add, else skip the next line
     Collections.sort(telefonMap.get(countrycode));
  }
  else {
     ArrayList<Float> tempList = new ArrayList<Float>();
     priceList.add(price);
     telefonMap.put(contrycode,tempList);
 }
}

现在您可以通过调用获取最小最大元素

telephoneMap.get(countrycode).get(0 or telephoneMap.get(countrycode).size()-1)

如果您在添加电话时没有对数组进行排序,那么您只需在此处调用数组并对其进行排序

于 2013-01-26T14:07:43.527 回答
0

如果我是你,我会使用如下地图。

// Mapping of counties and lis of prices
Map<String, List<Double>> telephones = new HashMap<String, List<Double>>();

//Searching for country code 0.1
List<Double> prices = telephones.get("0.1");

//Finding Max and Min
Double maximum = Collections.max(prices);
Double minimum = Collections.min(prices);
于 2013-01-26T13:56:25.640 回答