我有一个检查ArrayList中重复值的方法,我希望它返回包含重复值的那些EzVarIntegers的名称(包含名称和值以及其他与之无关的值)。
我在考虑使用两个并排的数组,这些数组的EzVarIntegers名称在同一个索引上具有重复值。因此,具有相同值X的两个EzVarIntegers将在ArrayOne [k]和ArrayTwo [k]中。
我对此很陌生,所以我想知道是否有更聪明的方法来解决这个问题?
public ArrayList<String> dupCheck(ArrayList<EzVarInteger> RoiNumbs) {
ArrayList<String> Dups = new ArrayList<String>();
for (int j=0;j<RoiNumbs.size();j++) {
for (int k=j+1;k<RoiNumbs.size();k++) {
if (k!=j && RoiNumbs.get(k).getValue() == RoiNumbs.get(j).getValue()) {
//TODO see question
}
}
}
return Dups;
}
答案 0 :(得分:1)
尝试使用Map(参见示例)
public static void main(String[] args)
{
List<String> strings = new ArrayList<>();
strings.add("a");
strings.add("b");
strings.add("a");
strings.add("c");
Map<String, Integer> counts = new HashMap<>();
for (String str : strings)
{
if (!(counts.containsKey(str)))
{
counts.put(str, 1);
}
}
for (Map.Entry<String, Integer> entry : counts.entrySet())
{
System.out.println(entry.getKey() + " = " + entry.getValue());
}
}
答案 1 :(得分:0)
请使用Set检查重复项。所以,
Set<Integer> set = new HashSet<>();
List<String> duplicateList = new ArrayList<>();
//if it is not present in the set then add it. If it present then add the //name of the EzVarInteger object in the output list
for(EzVarInteger ez: RoiNumbs){
if(!set.contains(ez.getValue)){
set.add(ez.getValue());
}else{
duplicateList.add(ez.getName());
}
}
//print the duplicate names
for(String name:duplicateList){
System.out.println(name);
}
希望这会对你有所帮助。
答案 2 :(得分:0)
您提出的算法具有计算成本O(n * n)
您可以对列表进行排序。这是在O(n * log(n))中完成的。然后遍历它以找到重复的元素。这是在O(n)中完成的。这样算法的计算代价为O(n * log(n)),这是更优的。