[英]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 keyScore
和List<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: 我正在尝试做的是:
List<Integer>
moves if the keyScore equals List<Integer>
移动 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. HashMap
( keyResult
> 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.