を見つけるためにJavaで特定の要件があります。私はCSVを読んで、私は、CSVファイルを持っている最長の親と子の関係
:添付画像に示すように、ファイルの内容は次のようになり を私たちは、ファイル内の2つの列を持っている:
Parent | Child
は最長の親と子の関係を見つけるために、ファイルを解析する必要があります。たぶん
Darrel->Aisha->John->Sam
を見つけるためにJavaで特定の要件があります。私はCSVを読んで、私は、CSVファイルを持っている最長の親と子の関係
:添付画像に示すように、ファイルの内容は次のようになり を私たちは、ファイル内の2つの列を持っている:
Parent | Child
は最長の親と子の関係を見つけるために、ファイルを解析する必要があります。たぶん
Darrel->Aisha->John->Sam
最も簡単な解決策は再帰です。与えられた子の最長の親子関係は、それ自身で拡張された各親の最長の親子関係です。
:私は(このコードはよく書かれていないあなたがこれを使用する予定の場合は、正しく例外を処理してくださいことに注意してください)
メインクラスをアイデアを説明するためにいくつかのコードを提供してきました(私はそれが理にかなって願っています)
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
このような何か:出力のようにする必要があります上記の例では
1)チャイルズ/両親などを追加するためのすべての便利なメソッドを持っているJavaで木のいくつかの良い実装を探します
2)CSVファイルを解析し、ツリーに移入します。
3)あなたのタスクは、そのツリー内で最も長いパスの発見になります。 See this
木の中で最長のパスを見つけることは無向木です。ここでは、指向の親子関係 –
が必要です。ステップ2では、CSVファイルに存在する親子関係に従ってツリーを作成します。その木の中で最も長い「道」を見つけるよりも。 – nick79
ええ、AとBはCの子だと言います。あなたが提供したリンクがA-C-Bを返すと思います。 –
あなただけの入力ストリームからファイルを読み込む必要があり、その後、地図にデータを格納するための分割を使用し、それをループして何を見つけますあなたが必要です。 –
PSo
まだ試しましたか?これまでに書いたコードに関する_specific_問題や質問がありますか? Stackoverflowはフォーラムやコード作成サービスではなく、Q&Aサイトです。 –
@ PSo人々が複数の子供を持つことができるので、マップが機能しない –