Функция компаратора в адаптере для значений с плавающей запятой - PullRequest
0 голосов
/ 21 июня 2020

Я получаю расстояние от моей базы данных, и я хочу отсортировать свои данные, например, кратчайшее расстояние в списке должно сначала отображаться в RecyclerView. Я реализовал компаратор в классе модели m Profile следующим образом:

public class Profiles implements Comparator<Profiles>

затем переопределите метод в классе модели:

 @Override
    public int compare(Profiles profiles, Profiles t1) {
        return Float.compare(profiles.getDistance(), t1.getDistance());
    }

Теперь в моем классе, где я устанавливаю адаптер, я Я не понимаю, какой список должен быть передан в Collections.sort () , поскольку я даю ему список типа Profile, и он дает мне эту ошибку:

no suitable method found for sort(ArrayList<Profiles>) method Collections<T#1>sort(List<T#1>) is not applicable

это то, что я делаю в своем классе RecyclerView

reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    Profiles profiles = ds.getValue(Profiles.class);
                    profiles.setDistance(distanceFunc());
                    String covid = (String) ds.child("covid_recovered").getValue();
                    String dengue = (String) ds.child("dengue_recovered").getValue();
                    for (DataSnapshot option : ds.child("matched_bloodGroups").getChildren()) {
                        canDonateBG.add(String.valueOf(option.getValue()));
                    }
                    if (canDonateBG.contains(bloodGroup)) {
                        if (recoverey != null) {
                            if (covid.equals(covidRecover)) {
                                list.add(profiles);
                                canDonateBG.clear();
                            } else if (dengue.equals(dengueRecover)) {
                                list.add(profiles);
                                canDonateBG.clear();
                            }
                }
              
                Collections.sort(list);

                donarAdapter = new DonarAdapter(DonarList.this, list);
                recyclerView.setAdapter(donarAdapter);
            }

Итак, какой список я должен передать функции сортировки, поскольку она не принимает список типа Profile

1 Ответ

1 голос
/ 21 июня 2020

Согласно docs существует два метода сортировки: sort, который вы вызываете, который sort(List<T> list) ожидает, что вы реализуете Comparable not Comparator, он сортирует элементы в естественном порядке, вызывая compareTo() метод, если они происходят из библиотеки, например, класса String. Сортировка, которую вы вызываете, не может найти этот метод, потому что у вас есть compare() not compareTo()

Тот, который принимает Comparator, это sort(List<T> list, Comparator<? super T> c), в вашем случае вы можете использовать его как Collections.sort(list,this) вместо Collections.sort(list), если вы хотите использовать Comparator, только в противном случае вы можете реализовать Comparable и переопределить compareTo, и это не похоже на то, что он не будет принимать Profiles список, он будет принимать любой, он просто должен реализовать правильный интерфейс

Я предлагаю сделать это, как показано ниже, в этом случае вам не нужно реализовывать какой-либо интерфейс В java 8 или выше

Collections.sort(list,(profiles,t1) -> Float.compare(profiles.getDistance,t1.getDistance()) 

или ниже java 8

Collections.sort(list,new Comparator()<Profiles>{
@Override
public int compare(Profiles profiles,Profiles t1){
   return Float.compare(profiles.getDistance,t1.getDistance);
  });

хорошего дня Умайр Икбал

...