开发者

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[].

Do you know if this is possible to do in 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. 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.

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. 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.

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

}

Thanks, Jetnori.

Hi all, Thank you for taking your time to help.

I can see the benefit of using 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. The method that I use from OpenCSV to read the file returns a List(String[]) where each String[] is one row in the file. The first element of each row is variable name (recA, ybjE etc). 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. 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. 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). I don't know if i am biting more than i can chew but I ha开发者_StackOverflow中文版ve 30 days to do it and I believe that with the help of people like you guys I will get through it.

Sorry for going on for a bit. thanks, 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. 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.

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:

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<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:

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. You also will probably also want to remove the ID part from these values, which my code does not do.


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.


I don't understand your goal, but for 'an object with 2 parts' you might consider storing them in a Hashtable: http://download.oracle.com/javase/6/docs/api/java/util/Hashtable.html

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜