3

クラスメインに示されている国コード値(複製可能)と対応する価格のリストがあります。この方法で最大/最小を見つけたいと思います。

国コード=0.1の場合、0.90、0.91、0.92から最大価格=0.92を取得する必要があります。他のすべての国コードについても同様です。つまり、個別の国コードごとに最大価格を検索します。

以下に示すコードで正常に実行しました。しかし、それは非常に遅く、良いアプローチではありません。

私の方法:「クラスメイン」のデータは関連しているため(国コード、価格付き)、最初にComparatorでクラス「Telephone」を使用して国コードでデータを並べ替え、次に「Telephone-ArrayList」のすべての要素をスキャンします"そして、ArrayList要素の比較で各"Distinct"国コードの最大値を見つけます。

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

これは、事前に並べ替えを行わなくても実行できるため、コストは、コレクションの1回の反復と、ハッシュマップの挿入時間だけになります。

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 で並べ替えられ、次に価格で並べ替えられます。

次に、Telephone コレクションを反復処理し、各反復の contrycode を保持できます。反復処理した国コードの最後の要素が、最も高い価格の要素になります。このようにして、国コードの比較と価格の比較を 1 つのステップで行うことができます。

 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) 電話を頻繁に追加する場合は、必要な場合にのみ最小最大値を取得する必要があります。

for 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 に答える