Бинарный поиск по году песен в массиве песен

select t3.name, sum(t3.prod_A) as Prod_A, sum(t3.prod_B) as Prod_B, sum(t3.prod_C) as    Prod_C, sum(t3.prod_D) as Prod_D, sum(t3.prod_E) as Prod_E  
from
(select t2.name as name, 
case when t2.prodid = 1 then t2.counts
else 0 end  prod_A, 

case when t2.prodid = 2 then t2.counts
else 0 end prod_B,

case when t2.prodid = 3 then t2.counts
else 0 end prod_C,

case when t2.prodid = 4 then t2.counts
else 0 end prod_D, 

case when t2.prodid = "5" then t2.counts
else 0 end prod_E

from 
(SELECT partners.name as name, sales.products_id as prodid, count(products.name) as counts
FROM test.sales left outer join test.partners on sales.partners_id = partners.id
left outer join test.products on sales.products_id = products.id 
where sales.partners_id = partners.id and sales.products_id = products.id group by partners.name, prodid) t2) t3

group by t3.name ;
0
задан user9986762 24 March 2019 в 19:51
поделиться

2 ответа

Похоже, вы не проверяете songs[probe].getYear() == year во время цикла while в findYear.

Может быть:

public static int findYear(MusicV3[] songs, int year) {
    int high = songs.length;
    int low = -1;
    int probe = -1;

    while (high - low > 1) {
        probe = (high + low) / 2;
        int probeSongYear = songs[probe].getYear();

        if (probeSongYear == year) {
            break;
        } else if (probeSongYear > year)
            high = probe;
        else
            low = probe;
    }

    if (probe >= 0 && songs[probe].getYear() == year) {
        while (songs[--probe].getYear() == year) {
        }
        return probe + 1;
    }

    return -1;
}

Не забудьте добавить «find =», как показано ниже:

    System.out.println("Searching for the year: 2014");
    find = /* <--- ADD THIS */ findYear(songs, 2014);

Чтобы напечатать все песни (как требуется в комментарии) для рассматриваемый год:

    System.out.println("Searching for the year: 2014");
    find = findYear(songs, 2014);
    if (find != -1) {
        System.out.println("We found songs made in the year 2014 in the song list: ");
        while (sortedSongs[find].getYear() == 2014) {
            System.out.println(sortedSongs[find++]);
        }
    }
0
ответ дан Not a JD 24 March 2019 в 19:51
поделиться

По моему мнению, реализация каждой вещи самостоятельно - не всегда лучший подход.

Что касается меня, я бы сделал HashMap<Integer, ArrayList<MusicV3>>, который будет хранить год для списка песен.

Так будет выглядеть окончательный код.

HashMap<Integer, ArrayList<MusicV3>> songs = new HashMap<>();

void addSong(MusicV3 song) {
    ArrayList<MusicV3> list = songs.get(song.year);

    if (list == null) {
        list = new ArrayList<>();
        songs.put(song.year, list);
    }

    list.add(song);
}

ArrayList<MusicV3> findSongsByYear(int year) {
    ArrayList<MusicV3> list = songs.get(year);
    if (list != null)
        return list;
    else
        return new ArrayList<>();
}
0
ответ дан Maxim Stepanov 24 March 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: