我想将List转换为List,以便新列表中的每个对象都包含每个String []的第一个元素。
你知道在java中是否可以这样做吗?
例如:
public List<String[]> readFile(){
String[]array1={"A","1.3","2.4","2.3"};
String[]array2={"B","1.43","3.4","2.8"};
String[]array3={"C","5.23","2.45","2.9"};
List<String[]>ReadFile= new ArrayList<String[]>();
ReadFile.add(array1);
ReadFile.add(array2);
ReadFile.add(array3);
return ReadFile;
}
现在我想要一个方法,它将从上面的List ReadFile以某种方式将字符串数组拆分成一个ID,它将是第一个元素“A”,“B”,“C”和另一个部分,它将是字符串数组,我将通过另一种方法将数字从String转换为Double类型。我已经有了转换为double的方法,但我需要能够跟踪ID字段,因为ID字段将用于识别数字数组。
一位朋友建议我创建一个Object,其中每个对象都有一个部分作为String ID,另一个部分作为数组。这是我不知道该怎么做的部分。
有人可以帮忙吗? 下面是我认为我应该有的方法声明,所以返回类型将是List,其中每个数组已经转换为具有两个部分的Object。
public List<Object> CreateObject(List<String[]>ReadFile){
}
谢谢, Jetnori。
大家好,感谢您抽出宝贵时间提供帮助
我可以看到使用HashTables的好处。我现在正试图实现它。我知道我可能会稍微偏离一点但只是为了解释我想要做的事情:
在我的项目中,我有CSV文件,其中包含有关基因表达水平的数据我使用OpenCSV读取文件的方法返回一个List(String []),其中每个String []是文件中的一行。每行的第一个元素是变量名(recA,ybjE等)。该行的其余部分将是与该变量相关的数字数据。我想计算Pearson在每个数组之间的相关性。我已经实现的方法已经为我做了,但我现在的问题是我必须从我的数组中删除字符串值,然后我可以通过遍历数组转换为double。在通过仍然保持链接到行的ID设法计算每个双打数组之间的相关性之后,我希望能够在相关性高于我将设置的阈值的基因之间绘制无向节点图(例如,相关性高于0.80)。我不知道我是否咬得比我能咬的多,但我有30天的时间去做,我相信在你这样的人的帮助下我会得到它。
很抱歉继续下去。
谢谢,
Jetnori。
答案 0 :(得分:3)
我同意Alb提供的答案,但这是您朋友建议的,首先您需要一个班级来表示数据。我已经包含了一个解析数据的构造函数和一个接受已解析数据的构造函数,具体取决于您对事物的想法。
public class NumberList {
private double[] numbers;
private String key;
public NumberList(Strig key, double[] numbers){
this.ley = key;
this.numbers = numbers;
}
public NumberList(String[] inputList) {
key = inputList[0];
numbers = new double[inputList.length-1];
for(int i=1;i<inputList.length;i++){
numers[i-1] = Double.parseDouble(inputList[i]);
}
}
public String getKey() {
return key;
}
public double[] getNumbers() {
return numbers;
}
}
然后你需要你的函数来生成列表:
public List<NumberList> CreateObject(List<String[]> ReadFile){
ArrayList<NumberList> returnList = new ArrayList<NumberList>(ReadFile.size());
for (String[] input : ReadFile) {
returnList.add(new NumberList(input));
}
return returnList;
}
注意,这使用解析数据的构造函数,如果使用其他构造函数,则“CreateObject”函数需要包含解析逻辑。
最后在旁注中,java中的标准约定是唯一大写的是类名和最终静态字段(出现在下划线所有的全部大写字母中),因此通常方法签名是:
public List<NumberList> createObject(List<String[]> readFile){
...
}
答案 1 :(得分:1)
听起来你需要Map而不是List,它允许你通过一个键(在你的案例ID中)来索引事物。
Map<String, String[]> map = new Hashmap<String, String[]>();
for( String[] array : ReadFile ){
map.put( array[0], array );
}
然后获取'A'的值数组:
String[] values = map.get( "a" );
如果你希望值是双精度而不是字符串,你需要在放入之前更改数组(map.put调用)我建议使用列表或其他集合而不是数组。您也可能还想从这些值中删除ID部分,我的代码不会这样做。
答案 2 :(得分:1)
public class Split_ListwithIDs {
Hashtable<String, String[]> table = new Hashtable<String, String[]>();
Splitter spl ;
public Split_ListwithIDs(Splitter split){
spl = split;
}
private void addEntry(String key , String[] vals){
table.put(key, vals);
}
public void parseList(List<String[]> list){
for(String[] entry : list){
String[] temp = new String[entry.length - 1];
System.arraycopy(entry, 1, temp, 0,entry.length - 1);
addEntry(entry[0], spl.GetStringArrayOfNumbers(temp));
}
}
class SplittingHelper implements Splitter{
@Override
public String[] GetStringArrayOfNumbers(String[] arr) {
String[] strArray = null ;
// implementation here
return arr;
}
}
interface Splitter {
String[] GetStringArrayOfNumbers(String[] arr);
}
}
您将不得不使用Hashtable而不是对象列表。(我假设您需要使用First alphabet作为键搜索给定条目的列表 - 如果您想要,这将非常费力使用List。。
在方法SplittingHelper
中,提供自定义逻辑来解析数字字符串并返回另一个数字字符串[]。
答案 3 :(得分:0)
我不了解您的目标,但对于“包含2个部分的对象”,您可以考虑将其存储在Hashtable中:http://download.oracle.com/javase/6/docs/api/java/util/Hashtable.html