[英]How to create a single HashMap member in a class for two different task with different initialization in two different constructors
為有向圖創建了兩個 HashMap(g1 和 g2),為無向圖創建了另一個,但我想要一個聲明 HashMap 並在各自的構造函數中進行不同的初始化。
class Graphs<T, V>{
public HashMap<T, LinkedList<T>> g1;
public boolean[] visited;
public HashMap<T, LinkedList<Pair<T, V>>> g2;
static class Pair<T, V>{
public T edge;
public V w;
Pair(T i, V j){
edge = i;
w = j;
}
public String toString(){
return "(" +edge + "," + w+ ")";
}
}
Graphs(int size){
g1 = new HashMap<>();
visited = new boolean[size +1];
}
Graphs(int size, boolean weight){
g2 = new HashMap<>();
visited = new boolean[size +1];
}
public void addEdges(T u , T v){
if(!g1.containsKey(u)){
g1.put(u, new LinkedList<>());
}
if(!g1.containsKey(v)){
g1.put(v, new LinkedList<>());
}
g1.get(u).add(v);
g1.get(v).add(u);
}
public void addEdges(T u , T v , V w){
if(!g2.containsKey(u)){
g2.put(u, new LinkedList<>());
}
if(!g2.containsKey(v)){
g2.put(v, new LinkedList<>());
}
g2.get(u).add(new Graphs.Pair<T, V>(v, w));
g2.get(v).add(new Graphs.Pair<T, V>(u, w));
}
}
類應該按照 單一職責原則設計:它們應該只做一件事。
你有一個 class 正在做兩件事。 因為這兩個addEdges
方法采用不同的參數(和不同數量的參數),並使用它們來創建不同的東西,所以這些類所做的兩個“東西”之間幾乎沒有共同點,除了它們都表示圖這一事實。
您也許可以設法在兩個分離的類之間共享一些邏輯; 但是,老實說,這種設計比復制代碼更糟糕。
class Graphs1<T>{
public HashMap<T, LinkedList<T>> g1;
public boolean[] visited;
Graphs1(int size){
g1 = new HashMap<>();
visited = new boolean[size +1];
}
public void addEdges(T u , T v){
g1.computeIfAbsent(u, k -> new LinkedList<>()).add(v);
g1.computeIfAbsent(v, k -> new LinkedList<>()).add(u);
}
}
class Graphs2<T, V>{
public boolean[] visited;
public HashMap<T, LinkedList<Pair<T, V>>> g2;
// Pair declaration omitted.
Graphs2(int size){
g2 = new HashMap<>();
visited = new boolean[size +1];
}
public void addEdges(T u , T v , V w){
g2.computeIfAbsent(u, k -> new LinkedList<>()).add(new Graphs.Pair<>(v, w));
g2.computeIfAbsent(v, k -> new LinkedList<>()).add(new Graphs.Pair<>(u, w));
}
}
我想你可以聲明一個 class 類似於:
class BaseGraph<T, E> {
public HashMap<T, LinkedList<E>> g = new HashMap<>();
public boolean[] visited;
BaseGraph(int size) {
this.visited = new boolean[size + 1];
}
protected void addEdge(T u, E value) {
g.computeIfAbsent(u, k -> new LinkedList<>()).add(value);
}
}
然后使它成為單獨類中的成員:
class Graphs1<T> {
BaseGraph<T, T> bg;
Graphs1(int size) { bg = new BaseGraph<>(size); }
public void addEdges(T u, T v) {
bg.addEdge(u, v);
bg.addEdge(v, u);
}
}
class Graphs2<T, V> {
BaseGraph<T, Pair<T, V>> bg;
Graphs2(size) { bg = new BaseGraph<>(size); }
public void addEdges(T u, T v) {
bg.addEdge(u, new Pair<>(v, w));
bg.addEdge(v, new Pair<>(u, w));
}
}
我仍然不完全相信這比復制代碼更值得。 它只真正節省了addEdge
行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.