简化 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");
简单明了。
是否有任何其他方法可以将此 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");
简单明了。