заполнение двумерного массива - PullRequest
1 голос
/ 10 марта 2011

У меня есть текстовый файл с датами для трех человек. Свойства для каждого человека разделяются запятой. Это выглядит так:

Patrick, Gary, Male, Blue, 1/28/1948
Carson, Larry, Male, Pink, 11/24/1976
Fisher, Paul, Male, Orange, 5/12/1995

В конечном итоге я пытаюсь отсортировать этих людей по фамилии в порядке возрастания.

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

Как я могу получить каждую строку для заполнения строки массива с каждым отдельным свойством в своем собственном столбце?

Может быть, я должен просто читать файл построчно, а затем добавлять каждый символ в двумерный массив, используя для заполнения lineFromFile.charAt (index), или что-то в этом роде? Любые примеры предложений будут с благодарностью.

Ответы [ 3 ]

1 голос
/ 10 марта 2011

String.split() может помочь здесь:

person[i] = line.split(", ");

Но то, что вы, вероятно, действительно хотите, это отказаться от идеи двумерного массива и создать список лиц, где Person - это класс, который вы определяете.

public class Person {
  public final String firstName;
  public final String lastName;
  public final String birthDate; //should really be a java.util.Date
  //...plus a constructor for the above
}

//...
List<Person> people = new ArrayList<Person>();
String line = reader.readLine();
String[] fields = line.split(", ");
people.add(new Person(fields[0], fields[1], /*...*/));

2D-массив почти всегда предполагает, что вам нужен класс для представления "строки" данных.

Сортировка тоже становится очень простой:

//sorts the people in descending order by first name
people.sort(new Comparator<Person>() {
    public int compare(Person a, Person b) {
       b.firstName.compareTo(a.firstName);
    }
});
0 голосов
/ 10 марта 2011

Предполагая, что вы можете получить считыватель

StringReader in = new StringReader(
    "Patrick, Gary, Male, Blue, 1/28/1948\n" +
    "Carson, Larry, Male, Pink, 11/24/1976\n" +
    "Fisher, Paul, Male, Orange, 5/12/1995");

вы можете читать его построчно с помощью буферизованного считывателя и использовать список для накопления строк

List<String[]> splitLines = new ArrayList<String[]>();
try {
  BufferedReader lineIn = new BufferedReader(in);
  for (String line; (line = lineIn.readLine()) != null;) {
    String[] lineParts = line.split(",");
    // Maybe check that lineParts has the right length here.
    splitLines.add(lineParts);
  }
} finally {
  in.close();
}

, затем вы можете конвертироватьсписок в двумерный массив.

String[][] linesArray = splitLines.toArray(new String[][] {});

, который затем можно отсортировать с помощью пользовательского компаратора.

Array.sort(linesArray, new Comparator<String[]>() {
  public int compare(String[] linea, String[] lineb) {
    ...  // the date should be in linea[4] and lineb[4].
  }
})();
0 голосов
/ 10 марта 2011

Я бы предложил не использовать двумерный массив и создать класс с полями, которые вы упомянули (согласно записи @ Mark). Затем создаем одномерный массив экземпляров этого класса.

Однако, если вы хотите пройти маршрут 2D-массива:

String[][] people = new String[][] {
  {"Patrick", "Gary", "Male", "Blue", "1/28/1948"},
  {"Carson", "Larry", "Male", "Pink", "11/24/1976"},
  {"Fisher", "Paul", "Male", "Orange", "5/12/1995"}
};
...