2017-04-16 4 views
2

インターネットで検索しましたが、この特定の種類の問題に対処するための質問や解決策は見つかりませんでした私はここで解決策を望んでいた。java.lang.IllegalStateException他のリストに基づいてリストから要素を削除中<Double> Java

これを解決する方法がわかりませんし、このコードが十分ではないと感じています。

import com.google.common.primitives.Doubles; 
import com.google.common.primitives.Ints; 
public List<City> getCitiestoVisit(List<City> cities,int totaldays) { 
    ArrayList<Integer> w=new ArrayList<Integer>(); 
    ArrayList<Integer> p=new ArrayList<Integer>();  
    for(City c:cities){ 
     w.add((int) c.getCoverage()); 
     p.add(c.getScore()); 
    } 
    days_incities = Ints.toArray(w); 
    priority_scores = Ints.toArray(p); 
    KnapsackInterface k = new FractionalKnapsack(); 
    double visit[] = k.optimize(days_incities, priority_scores, totaldays); 
    List<Double> list = Doubles.asList(visit); 
    System.out.println(visit.length); 
    Iterator<City> iterc = cities.iterator(); 
    Iterator<Double> iterd = list.iterator(); 
    while(iterc.hasNext() && iterd.hasNext()){ 
     if(iterd.next().intValue()==0){ 
      iterc.remove(); 
     } 
    } 
    return cities; 
} 

私には2つの質問があります。可能であれば、両方とも回答してください。 シナリオは都市がユーザ定義のオブジェクトであり、属性に「カバレッジ」時間が含まれています。上記の方法では都市と合計日を引数として受け取ります。だから私は与えられた総日数で時間を最適化しなければならなかったので、ナップザックアルゴリズムが十分に適していると感じました。 ここでのポイントは、ナップザックメソッドは整数引数のみをとり、分数の値を含むdouble配列変数を返すという点です。今度は配列をリストに変換することでナップザックメソッドに渡すことができました。しかし、私の問題は、上記の条件に基づいて要素を削除することができないということです。つまり、visit []リストに0が含まれていれば、都市の対応する要素を削除する必要があります。

質問1:都市リスト内の対応する都市を削除するには適切な解決策を提案してください 質問2:プリミティブ型からリスト型への変換が多すぎます。より良い方法で同じ機能を実現できる方法はありますか?提案してください。ありがとうございます

答えて

1

あなたは決してiterc.next()に電話していません。前もってiterc.next()を呼び出したことがない場合は、iterc.remove()に電話をかけることはできません。それがIllegalStateExceltionを得ている理由です。 を追加すると、if(iterd.next().intValue()==0)の問題の前に解決されます。

ArrayListの代わりにwpint個の配列として初期化することで、2つの変換を避けることができます。

+0

それは私の問題を解決します。どうもありがとう :) –

関連する問題