LinkedList из файла .txt (как прочитать все, кроме первого значения каждой строки)

#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, где ключом является имя пользователя. Или, что еще лучше, используйте Guava Multimap<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, а не добавлять его в массив.