Может кто-нибудь объяснить этот вопрос HashSet в Java? - PullRequest
1 голос
/ 26 мая 2020
import java.util.HashSet;
import java.util.Set;

public static boolean canTwoMoviesFillFlight(int[] movieLengths, int flightLength) {

    // movie lengths we've seen so far
    Set<Integer> movieLengthsSeen = new HashSet<>();

    for (int firstMovieLength : movieLengths) {

        int matchingSecondMovieLength = flightLength - firstMovieLength;
        if (movieLengthsSeen.contains(matchingSecondMovieLength)) {
            return true;
        }

        movieLengthsSeen.add(firstMovieLength);
    }

    // we never found a match, so return false
    return false;
}

Как HashSet уже имеет все значения из movieLengths?

Ответы [ 3 ]

0 голосов
/ 26 мая 2020

Ваш HashSet является пустым при создании:

Set<Integer> movieLengthsSeen = new HashSet<>();

Однако следующий шаг - l oop через набор значений, переданных в метод. Я добавил комментарии для уточнения:

//movieLengths is passed in
for (int firstMovieLength : movieLengths) {
        //create value from 2 passed in params
        int matchingSecondMovieLength = flightLength - firstMovieLength;

        //Here it checks to see if the value has been added to the hash,
        //if so, return true (won't happen on the first pass because
        //the hash set is empty).
        //Otherwise continue with the algorithm.
        if (movieLengthsSeen.contains(matchingSecondMovieLength)) {
            return true;
        }

        //If the hash doesn't have the value, which it won't on the first pass
        //and possible subsequent passes, it will add the value and repeat
        movieLengthsSeen.add(firstMovieLength);
    }

TLDR; HashSet - это пусто. Он заполняется по мере выполнения for-l oop.

0 голосов
/ 26 мая 2020

По мере прохождения расширенного набора for l oop каждый firstMovieLength добавляется к хеш-набору в конце. Итак, когда вы входите во вторую итерацию, присутствует предыдущий firstMovieLength, а в третьей итерации два предыдущих являются элементами хеш-набора и так далее.

0 голосов
/ 26 мая 2020

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

Вы можете использовать набор ha sh, сохранив дополнение к этому конкретному mov ie. Предположим, что у вас есть mov ie (60 минут) в вашей первой итерации, и вы вычисляете его дополнение, чтобы заполнить всю продолжительность полета (100 минут). Сначала набор пуст, поэтому вы не можете найти это значение и вставите продолжительность в набор. Во второй итерации у вас будет mov ie с 40 минутами, поэтому вы будете искать в наборе, если он содержит mov ie с (100-40 = 60) минутами, и вы обнаружите, что вы вставили первый. Итак, вы вернете истину.

...