Как преобразовать массив списков строк в список объектов - PullRequest
0 голосов
/ 24 февраля 2011

Я хочу преобразовать список в список, чтобы каждый объект в моем новом списке включал первый элемент каждой строки [].

Знаете ли вы, можно ли это сделать в 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 сверху, чтобы каким-то образом разбить массивы строк на идентификатор, который будет первым элементом «A», «B "," C "и другая часть, которая будет массивом строк, который я подставлю через другой метод для преобразования чисел из типа String в тип Double.У меня уже есть метод преобразования в удвоение, но мне нужно иметь возможность отслеживать поле идентификатора, поскольку поле идентификатора будет использоваться для идентификации массива чисел.

Друг предложил мне создатьОбъект, в котором каждый объект имеет одну часть как идентификатор строки, а другую часть как массив.Это та часть, которую я не знаю как сделать.

Кто-нибудь может помочь, пожалуйста?ниже приведено объявление метода, которое, как мне кажется, должно быть, поэтому тип возвращаемого значения будет List, где каждый массив был преобразован в Object из двух частей.

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

}

Спасибо, Jetnori.

Привет всем, Спасибо, что нашли время помочь.
Я вижу преимущества использования HashTables.Я сейчас пытаюсь это реализовать.Я знаю, что могу немного отвлекаться, но просто чтобы объяснить, что я пытаюсь сделать: в моем проекте у меня есть CSV-файл с данными об уровнях экспрессии генов.Метод, который я использую из OpenCSV для чтения файла, возвращает List (String []), где каждая String [] - это одна строка в файле.Первым элементом каждой строки является имя переменной (recA, ybjE и т. Д.).Остальная часть строки будет числовыми данными, относящимися к этой переменной.Я хочу вычислить корреляцию Пирсона между каждым из числовых массивов.Метод, который я реализовал, уже делает это для меня, но проблема, с которой я столкнулся сейчас, заключается в том, что мне пришлось удалить строковые значения из моих массивов, прежде чем я смог преобразовать их в удвоение, перебирая массив.После того, как мне удалось вычислить корреляцию между каждым массивом пар, сохранив идентификатор, связанный со строкой, я хочу нарисовать неориентированный граф узлов между генами, у которых корреляция выше порога, который я установлю (например корреляция выше 0,80).Я не знаю, кусаю ли я больше, чем могу жевать, но у меня есть 30 дней, чтобы сделать это, и я верю, что с помощью таких людей, как вы, ребята, я справлюсь.
Извините, что продолжаю немного,спасибо, Джетнори.

Ответы [ 4 ]

3 голосов
/ 24 февраля 2011

Я согласен с предоставленным Альбом ответом, однако это то, что предложил ваш друг, сначала вам нужен класс для представления данных. Я включил конструктор, который анализирует данные, и конструктор, который принимает уже проанализированные данные, в зависимости от того, как вам нравится думать о вещах.

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 голос
/ 24 февраля 2011
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 вместо списка объектов. (Я предполагаю, что вам придется искать в списке данную запись, используя Первый алфавит в качестве ключа - Это будет очень трудоемким, если вы хотите использовать список).

В методе SplittingHelper предоставьте свою собственную логику для анализа строки чисел и возврата другой строки [] чисел.

1 голос
/ 24 февраля 2011

Звучит так, как будто вам нужна Карта вместо списка, она позволяет индексировать объекты по ключу (в вашем 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).посоветуйте использовать список или другие коллекции вместо массива.Возможно, вы также захотите удалить часть идентификатора из этих значений, чего не делает мой код.

0 голосов
/ 24 февраля 2011

Я не понимаю вашу цель, но для «объекта с 2 частями» вы можете рассмотреть возможность их хранения в Hashtable: http://download.oracle.com/javase/6/docs/api/java/util/Hashtable.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...