2016-11-27 9 views
2

私のプログラムは以下のように構成されています:アトムの概念を表すクラスは本質的にストリングであり、一般的な概念のリストで作られた別のクラスです。どちらのクラスも、抽象クラスであるクラスConceptを拡張しています。これは、リスト内で原子概念と任意のネストされた概念の交差を持つことができることを意味します。 各アトムまたはコンストラクトは、toStringメソッドによって出力されます。 は、おおよそこれは、この文脈自由文法に基づいて、話す:Cは抽象クラスコンセプトである場合toString Javaメソッドで再帰を処理する方法は?

C : atom | (C and)+ C 

は、原子はAtomicConceptあり、(Cと)+ Cが交点です。

これはAtomicConceptクラスです:

public class AtomicConcept extends Concept{ 

private String atomicConceptName; 

public AtomicConcept(String c) { 
    this.atomicConceptName = c; 
} 

@Override 
public String toString() { 
    return atomicConceptName; 
    } 

}

これは、CHE Con​​ceptIntersectionクラスです:

import java.util.List; 

public class ConceptIntersection extends Concept{ 

private List<Concept> list; 

public ConceptIntersection(List<Concept> l) throws Exception { 
    if(l.size()>1) 
    { 
     this.list = l; 
    } 
    else 
    { 
     throw new Exception("Intersection needs at least two concepts!"); 
    } 
    } 

public String toString() 
{ 
    return Utils.conceptIntersection + Utils.lparen + Utils.splitConcepts(list) + Utils.rparen; 

} 

} 

あなたはToString関数で見ることができるように、私はまた、と呼ばれるメソッドを作成しましたsplitConceptsは、一般的な概念のリストを入力し、コンマで区切られた各概念で構成される1つの文字列を返します。

public static String splitConcepts(List<Concept> list) 
{ 
    String result = ""; 
    for (Concept item : list) { 
     System.out.println(item); 
     result += item.toString() + comma; 

    } 
    result = result.substring(0, result.length() - 1); 
    return result; 
} 

問題はどこですか? 別の関数でネストされた交差点を呼び出すと、この関数は決して終了しないので、私はこの関数に問題があります

一例:

public static void main(String[] args) throws DLRException { 
    // TODO Auto-generated method stub 

    AtomicConcept atom = new AtomicConcept("one"); 
    AtomicConcept at = new AtomicConcept("two"); 
    List<Concept> list = new LinkedList<Concept>(); 
    list.add(at); 
    list.add(atom); 
    DLRConceptIntersection intersection = new DLRConceptIntersection(list); 
    System.out.println(intersection); // works fine 
    list.add(intersection); 
    DLRConceptIntersection intersection2 = new DLRConceptIntersection(list); 
    System.out.println(intersection2); //loop never ends! 
} 

は、この問題を解決するための正しいアプローチですか?

+1

あなたは自分自身を含んで交差点を持っています。あなたは何を*印刷したいのですか? – user2357112

+1

あなたの 'list'は共有されていますか? – user2357112

答えて

3

あなたは、循環参照があります。

DLRConceptIntersection intersection = new DLRConceptIntersection(list); 
list.add(intersection); 

これは、無限再帰になぜtoString()実行されintersectionで言及同じインスタンスへの参照を含むようにintersectionの一覧を引き起こします。

私はintersectionintersection2が同じListを共有するつもりはないと仮定しています。

あなたはDLRConceptIntersectionコンストラクタでListのコピーを作成する場合は、それを避けることができます。

public ConceptIntersection(List<Concept> l) throws Exception { 
    if(l.size()>1) { 
     this.list = new ArrayList<>(l); 
    } else { 
     throw new Exception("Intersection needs at least two concepts!"); 
    } 
} 
+0

完璧!それは私のために働いている!私は同じリストを共有するために交差点と交差点2を意図していなかったので、ループは決して終わらなかった。ありがとう。 – user840718

+0

私はコンセプトの補完について同じコードで同じ問題を抱えています:public ComplementOfConcept(Concept c){ \t \t thisコンセプト= c; \t} コンセプトは抽象クラスなので、Listでも同じことができますか? – user840718

関連する問題