Nano Hash - криптовалюты, майнинг, программирование

Группировка идентичных элементов в ArrayList — MusicPlayer

Я пытаюсь сгруппировать несколько ArrayList для музыкального проигрывателя. Текущий список генерирует исполнителей для каждой песни, а не только для одного исполнителя. Надеюсь, это должно объяснить это лучше:

Снимок экрана

Мой текущий код для одного из моих фрагментов таков:

public class ArtistsFragment extends Fragment {

private ArrayList<Artist> artistList;
View view;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    view = inflater.inflate(R.layout.fragment_artists, container, false);

    GridView gvArtists = (GridView) view.findViewById(R.id.gvArtists);

    //instantiate list
    artistList = new ArrayList<>();

    //get artists from device
    getArtistList();

    // Group ArrayList..
    artistList = new ArrayList<>(new HashSet<>(artistList));

    //sort alphabetically by title
    Collections.sort(artistList, new Comparator<Artist>() {
                public int compare(Artist a, Artist b) {
                    return a.getArtist().compareTo(b.getArtist());
                }
            }
    );

    //create and set adapter
    ArtistAdapter artistAdt = new ArtistAdapter(getActivity(), artistList);
    gvArtists.setAdapter(artistAdt);

    return view;
}

void getArtistList() {
    //retrieve artist info
    ContentResolver musicResolver = getActivity().getContentResolver();
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);

    if (musicCursor != null && musicCursor.moveToFirst()) {
        //get columns
        int idColumn = musicCursor.getColumnIndex
                (MediaStore.Audio.Media._ID);
        int artistColumn = musicCursor.getColumnIndex
                (MediaStore.Audio.Albums.ARTIST);
        int artColumn = musicCursor.getColumnIndex
                (MediaStore.Audio.Media.ARTIST_ID);

        //add artists to list
        do {
            long thisId = musicCursor.getLong(idColumn);
            String thisArtist = musicCursor.getString(artistColumn);
            String thisArt = musicCursor.getString(artColumn);

            artistList.add(new Artist(thisId, thisArtist, thisArt));
        }
        while (musicCursor.moveToNext());
        musicCursor.close();
    }
}

}

Художник.класс

class Artist {
private final long id;
private final String artist;
private final String art;

public Artist(long artistID, String theartist, String artistArt) {
    id = artistID;
    artist = theartist;
    art = artistArt;
}

public long getID() {
    return id;
}

public String getArtist() {
    return artist;
}

public String getArt() {
    return art;
}
}

Я посмотрел на Map, я посмотрел на Set и теперь я просто запутался...

Итак, как мне сгруппировать мои ArrayList, чтобы удалить дубликаты разных исполнителей, а затем в конечном итоге использовать OnPicked, чтобы изменить ArrayList на эти сгруппированные песни в этой группе/категории?

Я даже на правильном пути или есть совершенно другой метод сортировки по жанрам/исполнителям/альбомам и т. д.?


  • Честно говоря, я не понял, о чем вы спрашиваете. 07.01.2015
  • что вы имеете в виду под группировкой? в вашем примере у вас есть список художников. Что именно вы хотите с этим сделать? есть и другие списки? 07.01.2015
  • какие поля класса Artist делают Artist уникальным? 07.01.2015

Ответы:


1

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

Set<Artist> set = new HashSet<Artist>(artistList);
artistList = new ArrayList<Artist>(set);
//then sort it...

или однострочный

artistList = new ArrayList<Artist>(new HashSet<Artist>(artistList));

Вы также должны переопределить методы equals() и hashCode() на основе полей, которые делают запись в вашем списке уникальной.

06.01.2015
  • Спасибо, но это дает тот же результат, что и без HashSet 07.01.2015
  • Каков ваш метод equals() в классе Artist? дайте нам код этого класса. 07.01.2015
  • вы должны добавить методы equals() и hashCode() на основе полей, которые делают исполнителя уникальным для ваших нужд. 07.01.2015
  • Как мне это сделать в моем случае? 07.01.2015
  • что характеризует художника уникальным? полевой художник? идентификатор? их комбинация? наверное это художник и искусство, я прав? 07.01.2015
  • Художник тот, на кого я смотрю, да. Каждый дубликат тех, кого я хочу удалить 07.01.2015
  • Давайте продолжим обсуждение в чате. 07.01.2015
  • Я сделал это. Я сгенерировал методы, используя только строку исполнителя, и теперь отображаются только уникальные исполнители. Спасибо 07.01.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..