2016-04-18 11 views
0

このテーブルを31個作成するのではなく、配列に適用する方法はありますか?Java配列のレイアウトを簡略化

レイアウトは次のようになります。

STATE_NAME |年| crimetype1 | crimetype2 |場所|数|


row1:state1 | 2001 | murder | knife | home | 5 |

row2:state1 | 2001 | murder | ax | home | 2 |

row3:state2 | 2001 |強盗|野球|ショップ| 1 |

など31の異なる状態。

5行の状態ごとに31個の配列を作成すると思っていましたが、他の簡単な方法がありますか?

+4

「State」クラスを作成せず、1年あたりのデータを追加してみませんか?プリミティブではなくOOで考える。ドメインをモデリングして、ソリューションを適用します。 – KevinO

+0

私はクラスを作成することを提案します。そのクラスは、必要なすべてのデータを状態として保持します。次に、すべてのアイテムの新しいインスタンスを作成するだけです。また、指定したように各行を表示する場合は、 'toString()'メソッドをオーバーライドすることもできます。 –

答えて

1

簡単に言えば、オブジェクト。そうすれば、ネストされた配列を持つ必要はありません。

クラスを作成します。このほかに

public class Crime{ 
    private int year; 
    private String state; 
    private String crimeType1, crimeType2; 
    private String place; 
    private int count; 

    //And then you'd have some useful stuff here... 
} 

を、私はあなたはもう31の値を組み合わせる必要があるとは思わない - 彼らは31の別々の、独立して存在しています。

0

まず、そのコレクション内の単一の行を表すことができるCrimeオブジェクトを作成します。状態に基づいて自然にそれに匹敵するようにしましょう。

public class Crime implements Comparable<Crime> { 
    private String state; 
    private Year year; 
    private String crimeType1; 
    private String crimeType2; 
    private String place; 
    private int count; 

    public int compareTo(Crime other) { 
     return state.compareTo(other.state); 
    } 
} 

このオブジェクトの構築は、読者の練習として行います。

次は、リストにその値の結果を追加したいと思うでしょう。

この時点で、あなたの作業はかなり完了しています。あなたが特定の状態での犯罪を取得したい場合、あなたはそれに基づいてフィルタリングするストリームAPIを使用することができます。

0

のgetHeaderは、(次のようにクラス犯罪を作成する方がよい)はヘッダを返すとのgetRow行を返します。 (またはのtoString)

public class Crime { 

    String stateName; 
    String year; 
    //... 

    public static String getHeader(){ 
     //you can improve this 
     return "state_name|year|crimetype1|crimetype2|place|count|"; 
    } 

    public String getRow(){   
     return stateName + "|" + year +"|" ... 
    } 

    public static void main(String[] args) { 
     List<Crime> state = new ArrayList<>(31); 
     //or 
     List<Crime> state = Arrays.asList(new Crime[] { 
      new Crime("ST","2004",..),... 
     }); 
    } 
} 
0

あなたはOOのそれ以外の場合はそこに道javaを使用してのどの時点で考えるのが良いですOO言語をコーディングしている場合KevinOが指摘したように。

状態以外のすべての値でCrimeクラスを作成し、地図

Map<String,ArrayList<Crime>> multiMap = new HashMap<String,ArrayList<Crime>>();

ここ

Stringは、状態の名前とその状態にあるすべての犯罪についてArrayListされているので、最後に存在しますmuliMap Objectの31個のキー(ここでは、ユニークキーとしての状態を使用しています)。

ので、後でstatewise犯罪をフィルタリングするあなた必要はありません、あなたがする必要があるすべては

ArrayList<Crime> state1Crimes = multiMap.get("state1"); 

シンプルで簡単です。