我有一个像这样的文件
Petal_Length 0 1.3 - 2.42
Petal_Length 1 2.42 - 3.54
Petal_Length 2 3.54 - 4.66
Petal_Length 3 4.66 - 5.78
Petal_Length 4 5.78 - 6.9
Petal_Width 5 0.3 - 0.76
Petal_Width 6 0.76 - 1.2200000000000002
Petal_Width 7 1.2200000000000002 - 1.6800000000000002
Petal_Width 8 1.6800000000000002 - 2.14
Petal_Width 9 2.14 - 2.6
Sepal_Length 10 4.3 - 5.02
Sepal_Length 11 5.02 - 5.739999999999999
Sepal_Length 12 5.739999999999999 - 6.459999999999999
Sepal_Length 13 6.459999999999999 - 7.179999999999999
Sepal_Length 14 7.179999999999999 - 7.899999999999999
Sepal_Width 15 2.3 - 2.76
Sepal_Width 16 2.76 - 3.2199999999999998
Sepal_Width 17 3.2199999999999998 - 3.6799999999999997
Sepal_Width 18 3.6799999999999997 - 4.14
Sepal_Width 19 4.14 - 4.6
我正在尝试将这些数据分组为
Petal_Length[0:1.3 - 2.42,1:2.42 - 3.54,2:3.54 - 4.66,3:4.66 - 5.78,4:5.78 - 6.9]
这是分组的方式吗? 我的目标是获取属性名称索引和范围。
是否使用hashmap?
更新
我做的是 -
while((line = bf.readLine())!=null){
String featureVal[] = line.split("\t");
val.add(featureVal[0]);
listToSet = new HashSet<String>(val);
//Creating Arraylist without duplicate values
attributeVal = new ArrayList<String>(listToSet);
//Extracting key
binMap.put(featureVal[0], new ArrayList<String>());
//Extracting Values
String[] cols = featureVal[1].split("\t");
for(int i = 0; i < cols.length; i++) {
if(attributeVal.get(i).equals(cols[i])){
System.out.println("in foorlop");
List<String> tmpList = binMap.get(attributeVal.get(i));
if(tmpList == null) {
tmpList = new ArrayList<String>();
}
System.out.println("cols[i]"+cols[i]);
tmpList.add(cols[i]);
//Get the list and add to that list instead of creating new temp list
binMap.put(attributeVal.get(i), tmpList);
}
}
System.out.println("binMap: "+binMap);
}
但我的输出是空的
binMap: {Petal_Width=[], Sepal_Length=[], Petal_Length=[], Sepal_Width=[]}
请建议。
答案 0 :(得分:1)
我宁愿使用JSON对象或自定义Java对象,如:
Class Flower{
List<String> Petal_length;
List<String> Petal_Width;
List<String> Sepal_length;
List<String> Sepal_Width;
}
如果你想说,花瓣长度的范围,那么在0指数,我们可以做一些事情 字符串范围= flower.Petal_length.get(0)
使用Object,它更灵活,如果以后您获得新文件或计划添加新属性
答案 1 :(得分:1)
以下是您的示例代码,请注意如何使用范围和属性等域类来方便字符串解析。所有分组都是通过常规的Java映射完成的。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class PetalGrouping {
private static final String input = "Petal_Length\t0\t1.3 - 2.42\n"
+ "Petal_Length\t1\t2.42 - 3.54\n"
+ "Petal_Length\t2\t3.54 - 4.66\n"
+ "Petal_Length\t3\t4.66 - 5.78\n"
+ "Petal_Length\t4\t5.78 - 6.9\n"
+ "Petal_Width\t 5\t0.3 - 0.76\n"
+ "Petal_Width\t 6\t0.76 - 1.2200000000000002\n"
+ "Petal_Width\t 7\t1.2200000000000002 - 1.6800000000000002\n"
+ "Petal_Width\t 8\t1.6800000000000002 - 2.14\n"
+ "Petal_Width\t 9\t2.14 - 2.6\n"
+ "Sepal_Length\t10\t4.3 - 5.02\n"
+ "Sepal_Length\t11\t5.02 - 5.739999999999999\n"
+ "Sepal_Length\t12\t5.739999999999999 - 6.459999999999999\n"
+ "Sepal_Length\t13\t6.459999999999999 - 7.179999999999999\n"
+ "Sepal_Length\t14\t7.179999999999999 - 7.899999999999999\n"
+ "Sepal_Width\t 15\t2.3 - 2.76\n"
+ "Sepal_Width\t 16\t2.76 - 3.2199999999999998\n"
+ "Sepal_Width\t 17\t3.2199999999999998 - 3.6799999999999997\n"
+ "Sepal_Width\t 18\t3.6799999999999997 - 4.14\n"
+ "Sepal_Width\t 19\t4.14 - 4.6";
public static void main(String... args) {
Map<String, List<Attribute>> map = new HashMap<String, List<Attribute>>();
String[] lines = input.split("\n");
for (String line : lines) {
Attribute attribute = Attribute.parse(line);
List<Attribute> attributeList = map.get(attribute.getName());
if (attributeList == null) {
attributeList = new ArrayList<Attribute>();
map.put(attribute.getName(), attributeList);
}
attributeList.add(attribute);
}
System.out.println(map);
}
}
class Range {
private double from;
private double to;
private Range(double from, double to) {
this.from = from;
this.to = to;
}
public static Range parse(String string) {
String[] parts = string.split(" ");
if (parts.length != 3) { throw new RuntimeException("Parsing failed for line: " + string); }
return new Range(Double.parseDouble(parts[0].trim()), Double.parseDouble(parts[2].trim()));
}
@Override
public String toString() {
return "{from=" + from + ", to=" + to + '}';
}
}
class Attribute {
private String name;
private int index;
private Range range;
protected Attribute(String name, int index, Range range) {
this.name = name;
this.index = index;
this.range = range;
}
public static Attribute parse(String line) {
String[] lineParts = line.split("\t");
if (lineParts.length != 3) { throw new RuntimeException("Parsing failed for line: " + line); }
String name = lineParts[0].trim();
int index = Integer.parseInt(lineParts[1].trim());
Range range = Range.parse(lineParts[2].trim());
return new Attribute(name, index, range);
}
@Override
public String toString() {
return "index=" + index + " " + range + '}';
}
public String getName() {
return name;
}
}