Найти все общие элементы в двух списках - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь найти общие элементы в моем ArrayList "list1"

List<LocalDate> list1 = new ArrayList<> ();
for (LocalDate d = dateFrom; !d.isAfter(dateTo); d = d.plusDays(1)) {
      dates.add(d);

, который состоит из всех дат между "dateFrom" и "dateTo" и моего списка "list2"

List<LocalDate> list2 = Arrays.asList(dateTime);

где dateTime - переменная, в которой хранятся только даты из текстового файла со следующей структурой:

1946-01-12;07:00:00;-1.3;G
1946-01-12;13:00:00;0.3;G
1946-01-12;18:00:00;-2.8;G
1946-01-13;07:00:00;-6.2;G
1946-01-13;13:00:00;-4.7;G
1946-01-13;18:00:00;-4.3;G

Я попытался использовать list2.retainAll(list1);, чтобы найти все даты в списке list2, который также находится в list1, но я думаю, что моя проблема в том, что list2 не является arraylist. Как я могу это исправить?

private static List<WeatherDataHandler> weatherData = new ArrayList<>();
public void loadData(String filePath) throws IOException {
//Read all data
    List<String> fileData = Files.readAllLines(Paths.get("filePath"));

    Map<String, Long> frequencyMap = new LinkedHashMap<>();

    LocalDate dateFrom = LocalDate.of(1946,01,12);
    LocalDate dateTo = LocalDate.of(1946, 01, 14);

    List<LocalDate> list1 = new ArrayList<> ();
    for (LocalDate d = dateFrom; !d.isAfter(dateTo); d = d.plusDays(1)) {
      dates.add(d);

    }

    for(String str : fileData) {
        List<String> parsed = parseData(str);
        LocalDate dateTime = LocalDate.parse(parsed.get(0));
        LocalTime Time = LocalTime.parse(parsed.get(1));
        double temperature = Double.parseDouble(parsed.get(2));
        String tag = parsed.get(3);

        WeatherDataHandler weather = new WeatherDataHandler(dateTime, Time, temperature, tag);
        weatherData.add(weather);

        List<LocalDate> list2 = Arrays.asList(dateTime);

        list2.retainAll(list1); 

        String strDate = list2.toString();
        frequencyMap.compute(strDate,
                (date, count) -> count == null ? 1 : count + 1);
    }

    for (Map.Entry<String, Long> entry : frequencyMap
            .entrySet()) {
        if (entry.getValue() < 24){
        System.out.println(
                entry.getKey() + ": " + (24-entry.getValue()));
    }}

1 Ответ

0 голосов
/ 03 марта 2020

Вы можете сделать это следующим образом:

List<LocalDate> commonList = new ArrayList<LocalDate>();
for (LocalDate date : list1) {
    if(list2.contains(date)) {
        commonList.add(date);
    }
}
System.out.println("Common elements: " + commonList)

[Обновить]

Заменить

if (entry.getValue() < 24)

на

if (entry.getValue() < 24 && !entry.getKey().equals("[]"))

в вашем коде, чтобы избавиться от чего-то вроде []: 23.

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