2009-07-23 6 views
1

私はしばしば次のような状況に直面しています。テーブル(ネストされた配列)にいくつかのデータがあり、その中のすべての項目をループする必要があります。最初と最後のアイテムとアイテムグループのループデザインですか?

要件:

  1. 最初の項目が識別され、別々に処理されなければなりません。
  2. 最後の項目は個別に識別して処理する必要があります。
  3. 類似したアイテムがソートされている場合は、最初と最後のグループ項目が識別されたグループで識別される必要があります。 (この場合、性別で分類/分類)
  4. グループ項目の小計とすべての項目の合計を指定する必要があります。

DATA:性別、姓で注文すると仮定するとファーストネーム、姓、tvshow、性別 と コミック文字。

Turanga|Leela|Futurama|Female 
Marge|Simpson|The Simpsons|Female 
Eric|Cartman|South Park|Male 
Peter|Griffin|Family Guy|Male 
Homer|Simpson|The Simpsons|Male 

QUESTION: どのように次の出力が生成されたループ(!どんな言語歓迎)コードでしょうか? インデントは重要ではありません。

OUTPUT:

First Entry: Turanga Leele (Futurama) 
-- 
First Female: Turanga Leela (Futurama) 
Last Female : Marge Simpson (The Simpsons) 
-- 
Total Females: 2 
-- 
First Male: Eric Cartman (South Park) 
      Peter Griffin (Family Guy) 
Last Male : Homer Simpson (The Simpsons) 
-- 
Total Males: 3 
-- 
Last Entry: Homer Simpson (The Simpsons) 
-- 
Total Entries: 5 

答えて

1

私は(Javaの)でこれを行うには、世界で最も詳細な言語を選んだが、これは、あなたが欲しいものを行う必要があります。 1回のパスで済みますが、先読みの行が1つ必要です。任意の数の行に適応するのは比較的容易であろうが、それはまた、入力の少なくとも2つの行を必要とします。

import java.util.Arrays; 
    import java.util.HashMap; 
    import java.util.Iterator; 
    import java.util.List; 
    import java.util.Map; 

    import static java.lang.System.out; 

    public class Loop { 
     static enum Col { FIRST_NAME, LAST_NAME, TV_SHOW, GENDER } 

    private static final List<String[]> characters = Arrays.asList(
      new String[] {"Turanga", "Leela", "Futurama", "Female"}, 
      new String[] {"Marge", "Simpson", "The Simpsons", "Female"}, 
      new String[] {"Eric", "Cartman", "South Park", "Male"}, 
      new String[] {"Peter", "Griffin", "Family Guy", "Male"}, 
      new String[] {"Homer", "Simpson", "The Simpsons", "Male"});  

    public static void summarize(List<String[]> character, Col groupBy) { 
     assert character.size() > 1;   
     int total = 0; 
     Iterator<String[]> i = characters.iterator(); 
     String[] row = next(i); 
     String[] peek = next(i); 
     String group; 
     out.print("First Entry:" + format(row));   
     Map<String, Integer> subTotals = new HashMap<String, Integer>(); 
     do { 
      group = col(row, groupBy); 
      out.print("First " + group + ":");    
      subTotals.put(group, 0); 
      do { 
       out.print(format(row)); 
       total = incrementTotals(total, group, subTotals); 
       row = peek; 
       peek = next(i); 
      } while (peek != null && col(peek, groupBy).equals(group)); 
      total = incrementTotals(total, group, subTotals); 
      out.print("Last " + group + ":" + format(row)); 
      out.println("--"); 
      out.println("Total " + group + "s:" + subTotals.get(group)); 
      out.println("--"); 
      if (peek == null) break; 
      row = peek; 
      peek = next(i);    
     } while(true); 
     out.print("Last Entry:" + format(row)); 
     out.println("--"); 
     out.println("Total Entries:" + total);   
    } 


    private static String[] next(Iterator<String[]> i) { 
     if (i.hasNext()) 
      return i.next(); 
     return null; 
    } 


    private static int incrementTotals(int total, String group, 
      Map<String, Integer> subTotals) { 
     total++; 
     subTotals.put(group, subTotals.get(group) + 1); 
     return total; 
    } 

    private static String format(String[] row) { 
     return col(row, Col.FIRST_NAME) + " " + col(row, Col.LAST_NAME) 
      + "(" + col(row, Col.TV_SHOW) + ")\n"; 
    } 

    private static String col(String[] row, Col col) { 
     return row[col.ordinal()]; 
    } 

    public static void main(String args[]) { 
     summarize(characters, Col.GENDER); 
    } 

} 

出力は次のとおりです。

First Entry:Turanga Leela(Futurama) 
First Female:Turanga Leela(Futurama) 
Last Female:Marge Simpson(The Simpsons) 
-- 
Total Females:2 
-- 
First Male:Eric Cartman(South Park) 
Peter Griffin(Family Guy) 
Last Male:Homer Simpson(The Simpsons) 
-- 
Total Males:3 
-- 
Last Entry:Homer Simpson(The Simpsons) 
-- 
Total Entries:5 
+0

印象的なデザイン。 – capfu

1

関心のために、私は何本見することにしましたGroovyのように見えるでしょう。これはクロージャ、メタプログラミング、そしてクールなリスト演算子を持つ本当の言語です。次のコードは、リストがメモリ内にある必要があり、特に効率的ではありませんが、多かれ少なかれ同じ結果を示します。しかし、それははるかに読みやすく、まあまあです。

enum Col { FIRST_NAME, LAST_NAME, TV_SHOW, GENDER } 
def characters = [ 
     [ "Turanga", "Leela", "Futurama", "Female" ], 
     [ "Marge", "Simpson", "The Simpsons", "Female" ], 
     [ "Eric", "Cartman", "South Park", "Male" ], 
     [ "Peter", "Griffin", "Family Guy", "Male" ], 
     [ "Homer", "Simpson", "The Simpsons", "Male" ] 
] 

// Use Groovy Metaprogramming to add some methods to the List class 
List.metaClass.first = { cl -> if (delegate.size > 0) cl(delegate[0]) } 
List.metaClass.middle = { cl -> 
    if (delegate.size > 2) 1..delegate.size-2.each { i -> cl(delegate[i]) } 
} 
List.metaClass.last = { cl -> if (delegate.size > 1) return cl(delegate[delegate.size-1]) } 

def format(row) { 
    return row[Col.FIRST_NAME.ordinal()] + " " + 
      row[Col.LAST_NAME.ordinal()] + " (" + 
      row[Col.TV_SHOW.ordinal()] + ")" 
} 

// Loop through and summarize the Characters 
characters.first { row -> 
    println("First Entry: ${format(row)}") 
} 
def groups = characters.groupBy { row -> row[Col.GENDER.ordinal()] } 
groups.each { groupType, group ->  
    group.first { row -> println("First ${groupType}: ${format(row)}") } 
    group.middle { row -> println(format(row)) } 
    group.last { row -> println("Last ${groupType}: ${format(row)}") } 
    println("--") 
    println("Total ${groupType}s: ${group.size}") 
    println("--") 
} 
characters.last { row -> 
    println("Last Entry : ${format(row)}") 
    println("--") 
    println("Total Items: " + characters.size()) 
} 
+0

私が一番好きなのは、文字をソートして、GENDER(LASTNAMEを省略)で明示的に注文することを信用しないということです。 – capfu

関連する問題