bugfix> java > 投稿

基本的に、2つの値 int keyScore を保存するモデルがありますおよび List<Integer> moves 。メインクラスには、計算方法から生成されたこのモデルのリストがあります。

私がやろうとしているのは:

  1. List<Integer> を連結するkeyScoreが等しい場合に移動します
  2. 重複を削除

HashSet を使用しようとしました List<Integer> で等しいkeyScoreを見つけたときに移動しますが、モデルの複製になりました。

private class HeuristicResult {
        private int keyResult;
        private List<Integer> moves;
        private HeuristicResult(int keyResult, List<Integer> moves) {
            this.keyResult = keyResult;
            this.moves = moves;
        }
        private int getKeyResult(){
            return this.keyResult;
        }
        private List<Integer> getMoves(){
            return this.moves;
        }
        private void setMoves(List<Integer> moves){
            this.moves = moves;
        }
        @Override
        public String toString() {
            return String.format("%s : %s", this.keyResult, this.moves);
        }
    }
private List<HeuristicResult> concatHeuristicResults(List<HeuristicResult> heuristicResultsList){
            List<HeuristicResult> heuristicResults = heuristicResultsList;
            for(int i =0; i<heuristicResults.size()-2; i++){
                int score = heuristicResults.get(i).getKeyResult();
                for(int j = 0; j<heuristicResults.size()-1;j++){
                    if(score == heuristicResults.get(j).getKeyResult()){
                        heuristicResults.get(i).getMoves().addAll(heuristicResults.get(j).getMoves());
                        Set<Integer> temp = new HashSet<>(heuristicResults.get(i).getMoves());
                        heuristicResults.get(i).setMoves(new ArrayList<>(temp));
                    }
                }
            }
            return heuristicResults;
        } 

これは、連結しようとすると出力として得られるものです。

1 : [0, 1]
0 : [0, 1, 3, 6, 7, 8]
0 : [0, 1, 3, 6, 7, 8]
-10 : [3]
0 : [0, 1, 3, 6, 7, 8]
0 : [0, 1, 3, 6, 7, 8]
0 : [0, 1, 3, 6, 7, 8]
0 : [0, 1, 3, 6, 7, 8]
0 : [0, 1, 3, 6, 7, 8]
-1 : [0, 1, 7, 8]
0 : [0, 1, 3, 6, 7, 8]
0 : [0, 1, 3, 6, 7, 8]
0 : [0, 1, 3, 6, 7, 8]
-1 : [0, 1, 7, 8]
0 : [6]
0 : [6]

回答 1 件
  • これを試して:

    static Collection<HeuristicResult> concatenate(List<HeuristicResult> list) {
        HashMap<Integer, HeuristicResult> keys = new HashMap<>();
        for (HeuristicResult x: list) {
            HeuristicResult hr = keys.get(x.keyResult);
            if (hr != null) {
                // Merge hr and x.
                Set<Integer> moves = new HashSet<>();
                moves.addAll(hr.getMoves());
                moves.addAll(x.getMoves());
                hr.moves.clear();
                hr.moves.addAll(moves);
            }
            else {
                // Create a new entry into our keys map if it doesn't exist.
                keys.put(x.keyResult, x);
            }
        }
        return keys.values();
    }
    
    

    階層的にマージしようとしています。まず、一意の keyResult が必要です sおよびこれらの一意の keyResult のそれぞれ s moves をマージする 。それは2つのレベルのマージです。

    ザ・ HashMap  ( keyResult  ->  HeuristicResult )一意の keyResult のみを保持 sおよびそれらを最初の HeuristicResult に対してマップします  リストに表示されます。その後、繰り返し中に同じ keyResult が見つかった場合  再び、それは moves を引き出します  マップと反復で見つかったマップから、それらをマージします。マージされた Set  (最初にクリアすることにより)リストに戻されます。

あなたの答え