我如何 eliminate/remove 对象数组元素的副本,该元素在数组中重复了很多次。 (Return 相同的数组类型)
How can I eliminate/remove a duplication of an object array element which is duplicated a ton of time in the array. (Return same array type)
我试过这个 for 循环,但是当数组中有重复元素时,内部循环中断,如果数组中放置了超过 10 个重复元素,则外部循环停止。
我需要 return 一个相同对象类型的数组,因为我需要使用这些方法从中选取一些值。
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;
}
删除元素后需要重置内部索引,以便再次检查(和边界检查):
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]);
}
最高效的 O(N) 解决方案是使用 Map
,如 所示。
但是如果由于某些 constraints/limitations 而无法使用 Map
(例如只允许数组),另一种解决方案是将删除的元素设置为 null
并计算删除的数目,然后将 null
s 移到数组的末尾和 return 一个截断的数组:
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);
}
我试过这个 for 循环,但是当数组中有重复元素时,内部循环中断,如果数组中放置了超过 10 个重复元素,则外部循环停止。
我需要 return 一个相同对象类型的数组,因为我需要使用这些方法从中选取一些值。
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;
}
删除元素后需要重置内部索引,以便再次检查(和边界检查):
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]);
}
最高效的 O(N) 解决方案是使用 Map
,如
但是如果由于某些 constraints/limitations 而无法使用 Map
(例如只允许数组),另一种解决方案是将删除的元素设置为 null
并计算删除的数目,然后将 null
s 移到数组的末尾和 return 一个截断的数组:
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);
}