2017-05-25 9 views
-3

を見つけるためにJavaで特定の要件があります。私はCSVを読んで、私は、CSVファイルを持っている最長の親と子の関係

Image

:添付画像に示すように、ファイルの内容は次のようになり を

私たちは、ファイル内の2つの列を持っている:

Parent | Child 

は最長の親と子の関係を見つけるために、ファイルを解析する必要があります。たぶん

Darrel->Aisha->John->Sam 
+0

あなただけの入力ストリームからファイルを読み込む必要があり、その後、地図にデータを格納するための分割を使用し、それをループして何を見つけますあなたが必要です。 – PSo

+3

まだ試しましたか?これまでに書いたコードに関する_specific_問題や質問がありますか? Stackoverflowはフォーラムやコード作成サービスではなく、Q&Aサイトです。 –

+1

@ PSo人々が複数の子供を持つことができるので、マップが機能しない –

答えて

0

最も簡単な解決策は再帰です。与えられた子の最長の親子関係は、それ自身で拡張された各親の最長の親子関係です。

私は(このコードはよく書かれていないあなたがこれを使用する予定の場合は、正しく例外を処理してくださいことに注意してください)

メインクラスをアイデアを説明するためにいくつかのコードを提供してきました(私はそれが理にかなって願っています)

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 

public class Main { 

    public static void main(String[] args) throws FileNotFoundException, IOException { 

     Map<String, Person> personMap = new HashMap<>(); 
     Set<Person> parents = new HashSet<>(); 
     Set<Person> children = new HashSet<>(); 

     //Build tree 
     try(BufferedReader reader = new BufferedReader(new FileReader("file.csv"))){ 
      String line = reader.readLine(); 
      while(line != null){ 
       String[] parentChild = line.split("\\|"); 
       Person parent, child; 
       //find or create parent 
       if(personMap.containsKey(parentChild[0])) 
        parent = personMap.get(parentChild[0]); 
       else{ 
        parent = new Person(parentChild[0]); 
        personMap.put(parentChild[0], parent); 
       } 

       //find or create child 
       if(personMap.containsKey(parentChild[1])) 
        child = personMap.get(parentChild[1]); 
       else{ 
        child = new Person(parentChild[1]); 
        personMap.put(parentChild[1], child); 
       } 

       //add parent to child 
       child.addParent(parent); 

       parents.add(parent); 
       children.add(child); 

       line = reader.readLine(); 
      } 


     } 

     Set<Person> pureChildren = new HashSet<>(children); 
     pureChildren.removeAll(parents); 

     //Find longest path 
     List<Person> longest = new ArrayList<>(); 
     for(Person person:pureChildren){ 
      List<Person> path = person.getLongestPath(); 
      if(path.size() > longest.size()){ 
       longest = path; 
      } 
     } 

     //print path 
     for(Person p:longest){ 
      System.out.println(p.getName()); 
     } 

    } 

} 

そして、Personクラスを使用

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.List; 
import java.util.Set; 

public class Person { 

    private final String name; 
    private Set<Person> parents = new HashSet<>(); 

    private List<Person> longestPath = null; 

    /** 
    * Initialize a new person 
    */ 
    public Person(String name){ 
     this.name = name; 
    } 

    /** 
    * Return the name of this person 
    * @return 
    */ 
    public String getName(){ 
     return name; 
    } 

    /** 
    * Return a copy of the parent set 
    */ 
    public Set<Person> getParents(){ 
     Set<Person> copy = new HashSet<>(); 
     copy.addAll(parents); 
     return copy; 
    } 

    /** 
    * Add a parent to this child. 
    */ 
    public void addParent(Person parent){ 
     parents.add(parent); 
    } 

    /** 
    * Return the longest child-parent path, starting from and including this person 
    */ 
    public List<Person> getLongestPath(){ 
     if(longestPath == null){ 

      longestPath = new ArrayList<>(); 
      longestPath.add(this); 
      for(Person parent:parents){ 
       List<Person> path = parent.getLongestPath(); 
       if(path.size() >= longestPath.size()){ 
        path.add(0,this); 
        longestPath = path; 
       } 
      } 
     } 

     return new ArrayList<>(longestPath); 
    } 

} 

CSVファイル:(私が使用|それはあなたの例ではケースのように見えたので、セパレータとして、splittinを編集メインクラスのラインのグラムあなたが別の区切り文字を使用している場合)

Sam|John 
Mark|Tom 
John|Aisha 
Aisha|Darrel 
Jimmy|Salman 
Anne|Salman 
0

このような何か:出力のようにする必要があります上記の例では

1)チャイルズ/両親などを追加するためのすべての便利なメソッドを持っているJavaで木のいくつかの良い実装を探します

2)CSVファイルを解析し、ツリーに移入します。

3)あなたのタスクは、そのツリー内で最も長いパスの発見になります。 See this

+0

木の中で最長のパスを見つけることは無向木です。ここでは、指向の親子関係 –

+0

が必要です。ステップ2では、CSVファイルに存在する親子関係に従ってツリーを作成します。その木の中で最も長い「道」を見つけるよりも。 – nick79

+0

ええ、AとBはCの子だと言います。あなたが提供したリンクがA-C-Bを返すと思います。 –

関連する問題