我試過這個 for 回圈,但是當陣列中的重復元素時,內回圈會中斷,如果陣列中放置了 10 個以上的重復元素,則外回圈會停止。
我需要回傳一個相同物件型別的陣列,因為我需要使用這些方法從中挑選一些值。
public Mode insT(Guide[] guide){
Guide[] guideVo = checkGuideDuplication(guide);
}
public Guide[] checkGuideDuplication (Guide[] guide){
for(int i = 0; i<guide.length-1; i ){
for(int j = i 1; i<guide.length; i ){
if(guide[i].getGuide().trim().equals(guide[j].getGuide().trim())){
guide = (Guide[]) ArrayUtils.remove(guide);
}
}
}
return guide;
}
uj5u.com熱心網友回復:
洗掉元素后,您需要重置內部索引,以便再次檢查(和邊界檢查):
guide = (Guide[]) ArrayUtils.remove(guide);
j--;
如果您使用地圖清除重復項,則可以完全避免內部回圈:
public Guide[] checkGuideDuplication (Guide[] guide){
Map<String, Guide> uniques = new HashMap<>();
for(Guide g : guide){
uniques.putIfAbsent(g.getGuide().trim(), g);
}
return uniques.values().toArray(new Guide[0]);
}
uj5u.com熱心網友回復:
性能最好的 O(N) 解決方案是使用shmosel 的回答中Map所示的方法。
但是,如果Map由于某些約束/限制(例如,只允許使用陣列)而不能選擇使用,則另一種解決方案是將洗掉的元素設定為null并計算洗掉次數,然后將nulls 移到陣列的末尾并回傳一個截斷的大批:
public Guide[] checkGuideDuplication (Guide ... guide) {
int deleted = 0;
for (int i = 0; i < guide.length-1; i ) {
if (null == guide[i]) {
continue;
}
String currGuide = guide[i].getGuide().trim();
for(int j = i 1; j < guide.length; j ) {
if (null == guide[j]) {
continue;
}
if (currGuide.equals(guide[j].getGuide().trim())) {
guide[j] = null;
deleted ;
}
}
}
// shift remaining elements
for (int i = 0, j = 0; i < guide.length; i ) {
if (guide[i] != null) {
guide[j ] = guide[i];
}
}
return Arrays.copyOf(guide, guide.length - deleted);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/371789.html
上一篇:合并并獲取然后推送到一個陣列
