简体   繁体   English

如何将字符串数组列表转换为对象列表

[英]How to convert a List of String arrays to a List of objects

I want to convert a List to a List so that each object on my new list includes the first element of each String[]. 我想将列表转换为列表,以便新列表上的每个对象都包含每个String []的第一个元素。

Do you know if this is possible to do in java? 您知道这是否可以在Java中执行吗?

for example: 例如:

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;
}

Now I want a method which will take the List ReadFile from above to somehow split the arrays of strings into an ID which will be the first element "A", "B", "C" and another part which would be the string array of numbers which I will put through another method to convert numbers from String to type Double. 现在,我想要一个方法,该方法将从上方获取列表ReadFile,以某种方式将字符串数组拆分为一个ID,该ID将是第一个元素“ A”,“ B”,“ C”,而另一部分将是我将通过另一种方法将数字从String转换为Double类型的数字。 I have already got the method to convert to double but I need to be able to keep track of the ID field because the ID field will be used to identify the array of numbers. 我已经有了转换为double的方法,但是我需要能够跟踪ID字段,因为ID字段将用于标识数字数组。

A friend suggested that I create an Object where each objects has one part as a String ID and the other part as an array. 一位朋友建议我创建一个对象,其中每个对象的一部分作为字符串ID,另一部分作为数组。 That is the part which I do not know how to do. 那是我不知道该怎么做的部分。

Can anybody help please? 有人可以帮忙吗? below is the method declaration which I believe I should have so the return type will be List where each array has been converted to an Object with two parts. 下面是我认为应该有的方法声明,因此返回类型将是List,其中每个数组都已转换为包含两部分的Object。

public List<Object> CreateObject(List<String[]>ReadFile){

}

Thanks, Jetnori. 谢谢,Jetnori。

Hi all, Thank you for taking your time to help. 大家好,谢谢您抽出宝贵的时间为您提供帮助。
I can see the benefit of using HashTables. 我可以看到使用HashTables的好处。 I am as of now trying to implement it. 我到目前为止正在尝试实施它。 I know i might be sidetracking a little but just to explain what I am trying to do: In my project I have CSV file with data about gene expression levels. 我知道我可能会有点偏离,但只是为了解释我要做什么:在我的项目中,我有CSV文件,其中包含有关基因表达水平的数据。 The method that I use from OpenCSV to read the file returns a List(String[]) where each String[] is one row in the file. 我从OpenCSV中使用的读取文件的方法返回一个List(String []),其中每个String []是文件中的一行。 The first element of each row is variable name (recA, ybjE etc). 每行的第一个元素是变量名(recA,ybjE等)。 The rest of the row will be numbers data related to that variable. 该行的其余部分将是与该变量相关的数字数据。 I want to calculate Pearson's correlation between each of the number arrays. 我想计算每个数字数组之间的Pearson相关性。 The method which I have got implemented already does that for me but the problem that I have now is that I had to remove the string values from my arrays before I could convert to double by iterating over the array. 我已经实现的方法已经为我做到了,但是我现在遇到的问题是,必须先从数组中删除字符串值,然后才能遍历数组,将其转换为double。 After I have managed to calculate the correlation between each array of doubles by still keeping the ID linked to the row, I want to be able to draw an undirected node graph between the genes that have a correlation higher than a threshold which I will set (for example correlation higher than 0.80). 在设法通过仍然将ID链接到行来计算每个double数组之间的相关性之后,我希望能够在相关性高于我将要设置的阈值的基因之间绘制无向节点图(例如相关性高于0.80)。 I don't know if i am biting more than i can chew but I have 30 days to do it and I believe that with the help of people like you guys I will get through it. 我不知道我的咀嚼量是否超过我的咀嚼能力,但我有30天的时间去做,我相信在像你们这样的人的帮助下,我会成功的。
Sorry for going on for a bit. 对不起,请继续。 thanks, Jetnori. 谢谢,Jetnori。

I agree with the answer Alb provided, however this is what your friend has suggested, first you need a class to represent the data. 我同意Alb提供的答案,但是这是您的朋友的建议,首先,您需要一个类来表示数据。 I have included a constructor that parses the data and one that accepts already parsed data, depending on how you like to think of things. 我提供了一个构造函数,用于解析数据,并构造一个接受已经解析的数据的函数,具体取决于您对事物的看法。

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;
  }
}

Then you need your function to generate the list: 然后,您需要使用函数来生成列表:

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;
}

Note this uses the constructor that parses the data, if you use the other constructor then the "CreateObject" function would need to include the parsing logic. 请注意,这使用解析数据的构造函数,如果使用其他构造函数,则“ CreateObject”功能将需要包含解析逻辑。

Finally on a side note the standard convention in java is that the only thing that is capitalized are class names and final static fields (which appear in all caps sepearted by underscores), so conventionally the method signature would be: 最后,请注意,java中的标准约定是,唯一大写的是类名和最终的静态字段(出现在所有带下划线的大写字母中),因此通常方法签名为:

public List<NumberList> createObject(List<String[]> readFile){
    ...
}

Sounds like you need a Map instead of a List, it lets you index things by a key (in your case ID). 听起来您需要一个Map而不是一个List,它使您可以通过键(在您的情况下为ID)为事物建立索引。

Map<String, String[]> map = new Hashmap<String, String[]>();
for( String[] array : ReadFile ){
   map.put( array[0], array );
}

then to get the array of values for 'A' you would do: 然后获取“ A”的值数组,您可以这样做:

String[] values = map.get( "a" );

If you want the values to be doubles instead of strings you'll want to change the array before putting it (the map.put call) I'd advise using a list or other collections instead of an array also. 如果您希望将值改为双精度值而不是字符串,则需要在放置数组之前更改数组(map.put调用),我建议您使用列表或其他集合而不是数组。 You also will probably also want to remove the ID part from these values, which my code does not do. 您也可能还希望从这些值中删除ID部分,而我的代码不会这样做。

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);
}

} }

You will have to use a Hashtable instead of a list of objects.( I am assuming that you will need to search through the list for a given entry using the First alphabet as key - This will be very laborious if you want to use a List ). 您将不得不使用哈希表而不是对象列表。(我假设您将需要使用“第一个字母”作为键在列表中搜索给定的条目-如果要使用列表,这将非常麻烦)。

In the method SplittingHelper , provide your custom logic to parse the string of numbers and return another string[] of numbers. SplittingHelper方法中,提供自定义逻辑来解析数字字符串并返回另一个数字字符串[]。

我不了解您的目标,但是对于“有两个部分的对象”,您可以考虑将它们存储在哈希表中: http//download.oracle.com/javase/6/docs/api/java/util/Hashtable。 HTML

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM