简化 java 数组布局

simplifying java array layout

是否有任何其他方法可以将此 table 应用于数组而不是创建其中的 31 个?

布局如下:

state_name|年|犯罪类型1|犯罪类型2|地点|计数|


第 1 行:状态 1|2001|谋杀|刀|家|5|

第 2 行:state1|2001|murder|axe|home|2|

第 3 行:state2|2001|抢劫|棒球|商店|1|

等等 31 个不同的州。

我想为每个州创建 31 个数组,每行 5 行,但有没有其他方法可以使它更简单?

简单地说:对象。这样,您就不必嵌套数组了。

做一个class:

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 个单独的独立事件。

首先,创建一个 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);
    }
}

我将此对象的构建留作 reader 的练习。

接下来,您需要将该值的结果添加到列表中。

List<Crime> crimes = new ArrayList<>();

// In a loop reading the file
    crimes.add(crime);

此时你的工作已经大功告成了;如果您想按特定州获得犯罪,您可以使用 Stream API 进行过滤。

不如制造class犯罪如下 getHeader() returns header 和 getRow 将 return 行。 (或 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",..),... 
        });
    }
}

正如 KevinO 指出的那样,如果您正在编写面向对象语言的代码,那么最好以面向对象的方式思考,否则就没有必要使用 java

使用除 state 之外的所有值创建一个 Crime class,然后创建一个 Map

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

这里String是州名,ArrayList代表那个州的所有罪行,所以最后在muliMap中会有31个键(这里我们使用州作为唯一键) Object

所以以后你不需要过滤州级犯罪,你需要做的就是

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

简单明了。