#java
#java
Вопрос:
Моя конечная цель — создать связанный список, который сравнивает количество друзей, имеющихся у человека (т. Е. в приведенном ниже списке у Джо 4 друга, а у Кей 3 (Джо самый популярный). Данные для списка импортируются из текстового файла. Теперь мой вопрос заключается в том, как я могу прочитать все, кроме первого строкового значения, из текстового файла?
Прямо сейчас текстовый файл содержит следующие строковые данные:
Джо Сью, Мег Рай, Люк Кей Трей Фил Джордж
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String[]> list1 = new LinkedList<String[]>();
// Read the file
try {
BufferedReader in = new BufferedReader(new FileReader("C:\friendsFile"));
String names;
// Keep reading while there is still more data
while ((names = in.readLine()) != null) {
// Line by line read amp; add to array
String arr[] = names.split(" ");
String first = arr[0];
System.out.print("nFirst name: " first);
if (arr.length > 0)
list1.add(arr);
}
in.close();
// Catch exceptions
} catch (FileNotFoundException e) {
System.out.println("We're sorry, we are unable to find that file: n" e.getMessage());
} catch (IOException e) {
System.out.println("We're sorry, we are unable to read that file: n" e.getMessage());
}
}
}
Комментарии:
1.
List<String[]>
Рассмотрите возможность использованияMap<String, String[]>
вместо a, где ключом является имя пользователя. Или, что еще лучше, используйте GuavaMultimap<String, String>
, который решит проблемы с коллекцией за вас.
Ответ №1:
Чтобы сохранить массив, содержащий все имена, кроме первого, отдельно для каждой строки в вашем файле, вы могли бы заменить
list1.add(arr);
следующим:
list1.add(Arrays.copyOfRange(arr, 1, arr.length));
Ответ №2:
Просто небольшое замечание здесь: файл имен, где имя, фамилия и отчество разделены пробелом, вы не сможете отсортировать. Нельзя предполагать, что каждое имя состоит только из имени и фамилии. Возможно, я ошибся, прочитав ваш вопрос, но вам понадобится файл, похожий на CSV, где каждое имя было бы разделено запятой, тогда вы могли бы использовать что-то вроде:
String[] array = String.split(",");
int numberOfFriend = array.length - 1;
Комментарии:
1. Я полагаю, что каждая строка настроена так, где первым элементом является person, а остальные — друзья (только имена)
2. Я не из тех, кто судит, потому что мне дали глупый файл для обработки, и он выглядит как глупый 🙂
Ответ №3:
Рассмотрите возможность использования Guava:
Iterable<String> elements = Splitter.on(" ").split(line);
String firstNameInLine = Iterables.getFirst(elements);
Iterable<String> restOfNamesInLine = Iterables.skip(elements, 1);
Ответ №4:
Что вы могли бы сделать, это вызвать readLine () один раз непосредственно перед входом в ваш цикл while, а не добавлять его в массив.