2015-05-09 83 views
5

對於Java的做法,我想創建我的EmployeesDirectory類中的方法:刪除重複項的Array - Java的

  • 從陣列
  • 數組後應相同長度的刪除重複項刪除重複
  • 非空條目應該在數組的開始使得連續序列 - 以及actualNum應保持的條目的記錄

重複意思是:相同的名字,職位和薪資

這裏是我當前的代碼:

我就如何實現這一不確定 - 任何幫助,將不勝感激

class EmployeeDirectory { 

    private Employee dir[]; 
    private int size; 
    private int actualNum; 

    public EmployeeDirectory(int n) { 
     this.size = n; 
     dir = new Employee[size]; 
    } 

    public boolean add(String name, String position, double salary) { 
     if (dir[size-1] != null) { 
      dir[actualNum] = new Employee(name, position, salary); 
      actualNum++; 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 
+0

刪除重複項!你的意思是刪除具有相同名稱的重複員工? – MChaker

+0

@MChaker它們表示對象爲'a.equals(b)== true' –

回答

4

我寧願你沒有寫出清除重複的獨特方法。如果我是你,我會搜索add方法中的重複項,然後立即決定是否需要添加Employee

此外,爲什麼你不使用Sets(鏈接HashSet),而不是你的目的數組?由自己定義,不允許設置添加重複的,所以他們似乎作爲一種解決方案是適當

+0

Set並不總是有用,因爲它打破了元素的順序。但是,在迭代數組以收集不同的對象時,Set非常有用。 –

+1

@SashaSalauyou,如果您需要與插入順序相同的元素順序,則會有[LinkedHashSet](http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet .html)來達到這個目的:) –

+0

With'LinkedHashSet'你失去了在O(1)中通過索引查詢項目的能力。 –

1

如果你的任務狀態爲「從陣列刪除重複項」(即你不能使用ArrayList或添加項目時控制),您可以使用下面的方法:

public void removeDuplicates() { 
    Set<Employee> d = new HashSet<>(); // here to store distinct items 
    int shift = 0; 
    for (int i = 0; i > dir.length; i++) { 
     if (d.contains(dir[i])) {  // duplicate, shift += 1 
      shift++; 
     } else {      // distinct 
      d.add(dir[i]);    // copy to `d` set 
      dir[i - shift] = dir[i]; // move item left 
     } 
    } 
    for (int i = d.size(); i < dir.length; i++) 
     dir[i] = null;     // fill rest of array with nulls 

    actualNum = d.size(); 
} 

這裏,shift變量存儲在數組中迄今發現的重複的數量。每個不同的項目都移動到shift的位置,以便在保持初始順序的同時使序列連續。然後剩餘的項目被更改爲空值。

爲了使基於散列的集合與Employee情況下正常工作,您還需要重寫hashCode()equals()方法如下:

public class Employee { 

    //... 

    @Override 
    public int hashCode() { 
     return Objects.hash(name, position, salary); 
    } 

    @Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (o == null) return false; 
     if (!o.getType().equals(this.getType()) return false; 
     Employee e = (Employee) o; 
     return Objects.equals(e.name, name) 
      && Objects.equals(e.position, position) 
      && Objects.equals(e.salary, salary); // or e.salary == salary, if it primitive type 
    } 
} 
+0

將單個字符作爲參考名稱分配是一種不好的做法。參考名稱應該是有意義的。此外,你可能沒有得到集合。集合不能包含相等的對象。 –

+0

*「你可能沒有得到集合是什麼」* - 對不起,我不能繼續討論是這樣一種突然的方式... –

+0

我不是故意要冒犯你,而是設置自己「跳過」它的所有對象已經包含。此時你的代碼沒有意義。閱讀文檔。對不起 –

2

不幸的是,我還沒有得到Employee類來驗證我的代碼,但試試這個:

void removeDuplicates() { 
    int length = dir.length; 
    HashSet set = new HashSet(Arrays.asList(dir)); 
    dir = new Employee[length]; 
    Employee[] temp = (Employee[]) set.toArray(); 
    for (int index = 0; index < temp.length; index++) 
     dir[index] = temp[index]; 
} 

刪除重複項後代碼必須保持爲數組大小。在數組開始時,必須有有效的僱員,最後 - 空值。 不要忘了在你的開頭添加這個。Java文件

import java.util.Arrays; 
import java.util.HashSet; 
3

首先,覆蓋equalshashCode方法Employee類如下

@Override 
public boolean equals(Object other) { 
    if(this == other) return true; 

    if(other == null || (this.getClass() != other.getClass())){ 
     return false; 
    } 

    Employee guest = (Employee) other; 
    return Objects.equals(guest.name, name) 
      && Objects.equals(guest.position, position) 
      && Objects.equals(guest.salary, salary); 
} 

@Override 
public int hashCode() { 
    return Arrays.hashCode(new Object[] { 
       name, 
       position, 
       salary 
     }); 
} 

然後你可以使用流API distinct方法來刪除重複

返回由不同元素組成的流(根據 Object.equals(Object))。

你可以像這樣

Employee e1 = new Employee("John", "developer", 2000); 
Employee e2 = new Employee("John", "developer", 2000); 
Employee e3 = new Employee("Fres", "designer", 1500); 

Employee[] allEmployees = new Employee[100]; 
allEmployees[0] = e1; 
allEmployees[1] = e2; 
allEmployees[2] = e3; 

allEmployees = Arrays.asList(allEmployees).stream().distinct() 
      .toArray(Employee[]::new); 

Arrays.asList(allEmployees).forEach(System.out::println); 

輸出:(保持空以及非空條目)

John developer 2000.0 
Fres designer 1500.0 
null 
+0

@SashaSalauyou你對上述答案有什麼看法? – MChaker

+0

我認爲它很好(我也喜歡java 8的特性),但是你的'equals()'方法容易出錯,除非'name'和'position'不能保證是非空值。 –

+0

和你的'hashCode()'很差,通常它是由對象的所有非靜態屬性組合的。 –