2016-12-09 7 views
1

医療データをソフトウェアにインポートする前に、4つの医療データリストを事前に処理する必要があります。 Iは、それぞれ以下のように見えること、すでに注文し、4つのリストを与えている:4つのリストを1つにまとめるベストな方法

File 1) chapter 
A00-B99; 
C00-D48; 
D50-D89; 
C00-C99; 
E00-E90; 
... 
Z00-Z99; 

File 2) subchapter 
A00-A09; 
A15-A19; 
A92-A99; 
B95-B98; 
B99-B99; 
C00-C48; 
... 
Z80-Z99; 

File 3) Groups 
A00.- 
A01.- 
A02.- 
... 
C01.- 
.... 
Z99.- 

File 4) diagnoses 

A00.0; 
A00.1; 
A00.7; 
A00.8; 
A01.7; 
A02.8; 
.. 
Z00.3; 
Z00.4; 

終了時には、以下のリストでご注文ください。 各行はcsvファイル内の1行になります。

A00-B99; (Chapter) 
A00-A09; (Subchapter) 
A00.- (corresponding group) 
A00.0 (corresponding diagnoses) 
A00.1 
A00.7 
A00.8 
A01.- (corresponding group) 
A01.7 (corresponding diagnoses) 
A02.- (corresponding group) 
A02.8 (corresponding diagnoses) 
... 
B15-B99(Subchapter) 
... 
C00-C99 (Chapter) 
C00-D48 (Subchapter) 
C01.- (corresponding group) 
C01.2 (corresponding diagnoses) 

リンクされたハッシュマップを使用してこれまで試したことがありますが、正しい結果が得られません。結果はそれのように見えない

while (entries_kapitel.hasNext()) { 

    Entry thisEntry_kapitel = (Entry) entries_kapitel.next(); 
    String key_kapitel = (String) thisEntry_kapitel.getKey(); 
    String text_kapitel = (String) thisEntry_kapitel.getValue(); 

    // A00-B99 -> A und B 
    String kapitel_char1 = key_kapitel.split("-")[0].substring(0, 1); 
    String kapitel_char2 = key_kapitel.split("-")[1].substring(0, 1); 

    // A00-B99 -> 99 
    int kapitel_int2 = Integer.parseInt(key_kapitel.split("-")[1].substring(1, 3)); 
    // subchapters 
    while (entries_gruppen.hasNext()) { 

      Entry thisEntry_gruppen = (Entry) entries_gruppen.next(); 
      String key_gruppen = (String) thisEntry_gruppen.getKey(); 
      String text_gruppen = (String) thisEntry_gruppen.getValue(); 

      // Gruppe splitten T90-T89 
      String gruppe_char1 = key_gruppen.split("-")[0].substring(0, 1); 
      String gruppe_char2 = key_gruppen.split("-")[1].substring(0, 1); 
      int gruppe_int2 = Integer.parseInt(key_gruppen.split("-")[1].substring(1, 3)); 


      if (gruppe_char1.equals(gruppe_char2) == false){ 
       System.err.println("Subchapters start with the same capital!"); 
       System.exit(1); 
      } 
      while (entries_gruppierung.hasNext()) { 
      Entry thisEntry_gruppierung = (Entry) entries_gruppierung.next(); 
       String key_gruppierung = (String) thisEntry_gruppierung.getKey(); 
       String text_gruppierung = (String) thisEntry_gruppierung.getValue(); 

       String gruppierung_char1 = key_gruppierung.substring(0, 1); 
       int gruppierung_int1 =  Integer.parseInt(key_gruppierung.substring(1, 3)); 
(gruppierung_char1.equals(gruppe_char1) && gruppierung_int1 <= gruppe_int2) { 
        System.out.println("Chapter: " + key_kapitel + "  subchapter: " + key_gruppen + " group" + key_gruppierung); 


       while (diagnoses.hasNext()) { 
       .... 

(エントリが不足していると、彼らは正しい順序すべてではありません)必要があります このタスクを解決するための最良の方法は何ですか? 私は働く木を手に入れることができませんでした。これはおそらく最善の方法ですよね?

+0

私は個人的に私が最初に実際にあなたがしようとしているどのようなフィット構造で、あなたが受け取るデータを入れrecommentうJDBC –

+0

にSQL SELECT文のいくつかの並べ替えを行い、その後、データベースなどの埋め込みダービーにファイルをロードしますmodell:Subchapterオブジェクトのリストを含む章クラスを作成します。これはGroupオブジェクトなどのリストを含んでいます。このような構造で作業することは、多分もっと簡単で、たくさんの文字列でうまくいくでしょう。 –

答えて

1

私はあなたが必要としているなら、私は、SORT/MERGE結合アプローチを使用します。適切にソートされたエントリを含む4つのリストを考えてみましょう。次に、リストを交互にスキャンしてマージすることができます。私は、コードをテストしていませんが、あなたは一般的なアイデアを得るでしょう:

public class EntryComparator implements Comparator<Entry> 
{ 
    public boolean isSubsection(Entry e1, Entry e2) 
    { 
     // should return true if e2 subsection of e1 
    } 

    public int compare(Entry e1, Entry e2) 
    { 
     // see the Comparator interface documentation 
    } 
} 

List<Entry> chapters = new ArrayList<>(); 
List<Entry> subchapters = new ArrayList<>(); 
List<Entry> groups = new ArrayList<>(); 
List<Entry> diagnoses = new ArrayList<>(); 

List<Entry> result = new ArrayList<>(); // will hold the final result 

// populate the lists, maybe sort them using Collections.sort and the Comparator above 

int i1 = 0; 
int i2 = 0; 
int i3 = 0; 
int i4 = 0; 

EntryComparator c = new EntryComparator(); 

while(i1 < chapters.size()) 
{ 
    result.add(chapters.get(i1)); 
    while(i2 < subchapters.size() && 
      c.isSubsection(chapters.get(i1), subchapters.get(i2))) 
    { 
     result.add(subchapters.get(i2)); 
     while(i3 < groups.size() && 
       c.isSubsection(subchapters.get(i2), groups.get(i3))) 
     { 
      result.add(groups.get(i3)); 
      while(i4 < subchapters.size() && 
        c.isSubsection(groups.get(i3), diagnoses.get(i4))) 
      { 
       result.add(diagnoses.get(i4)); 
       i4++; 
      } 
      i3++; 
     } 
     i2++; 
    } 
    i1++; 
} 

EDITは:911DidBushによって与えられたアドバイスは、あなたが専門のクラスと同じパターンを適用することができる、良いものです。

0

あなたの返信に感謝します。お勧めの通り、各リストをクラスとして実装します。これは本当に良いアイデアのようです。クラス章はこのように見えます。他のクラスも同じ構造をしています。

public class Chapter { 

private String key_chapter; 
private String text; 

private ArrayList<Subchapter> subchapters = new ArrayList<>(); 

public Chapter(String chapter, String text) { 
    this.key_chapter = chapter; 
    this.text = text; 
    subchapters = new ArrayList<Subchapter>(); 
} 

public String getChapter() { 
    return key_chapter; 
} 

public String getText() { 
    return text; 
} 

public void addSubchapter(String subchapter, String text) { 
    subchapters.add(new Subchapter(subchapter, text)); 
} 

public Subchapter getKeyAtIndex(int index) { 
    return subchapters.get(index); 
} 

// get the entire ArrayList: 
public ArrayList getListOfSubchapters() { 
    return subchapters; 

} 
} 
関連する問題