简体   繁体   English

如何仅在列表中保留唯一值? -Java

[英]How to leave only unique values in a List? - java

Basically, I have a model that stores two values int keyScore and List<Integer> moves . 基本上,我有一个模型,该模型存储两个值: int keyScoreList<Integer> moves int keyScore In the main class, I have a list of this model that is generated from calculation method. 在主类中,我具有从计算方法生成的此模型的列表。

What I am trying to do is: 我正在尝试做的是:

  1. Concatenate List<Integer> moves if the keyScore equals 如果keyScore等于,则串联List<Integer>移动
  2. Remove duplicates 删除重复项

I tried to use HashSet on List<Integer> move, when I find equal keyScore, but I ended up with duplicates of my model. 当我找到相等的keyScore时,我尝试在List<Integer>移动上使用HashSet ,但最终得到模型的重复项。

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;
        }  

This is what I get as an output when I try to concatenate: 这是我尝试串联时得到的输出:

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]

Try this: 尝试这个:

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();
}

You're trying to merge hierarchically. 您正在尝试分层合并。 First, you want unique keyResult s and for each of these unique keyResult s you want to merge moves . 首先,你要独特keyResult S和每个这些独特的keyResult是你要合并moves That's 2 levels of merging. 这是2个合并级别。

The HashMap ( keyResult -> HeuristicResult ) keeps only unique keyResult s and maps them against the first HeuristicResult it sees in the list. HashMapkeyResult > HeuristicResult )仅保留唯一的keyResult ,并将它们映射到列表中看到的第一个HeuristicResult Then during the iteration if it finds the same keyResult again, it pulls out the moves from the map and the one found in iteration and merges them. 然后,如果在迭代过程中再次找到相同的keyResult ,则会从地图中提取moves并在迭代中找到一个moves并将其合并。 The merged Set is put back into the list (by clearing it first). 合并的Set将放回到列表中(首先清除它)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM