Используйте HashSet, чтобы отсеять повторяющиеся значения. Список возвращает либо пустой, либо повторяющиеся значения - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь удалить повторяющиеся значения из ArrayList, используя HashSet, чтобы названия городов не возвращались более одного раза, если они совпадают ... Список возвращается либо пустым, либо все еще показывает повторяющиеся значения. Надеялся, что кто-то может сказать мне, где ошибка в моем коде, чтобы не возвращались повторяющиеся значения ...

Я использую это для справки:

Set<String> set = new HashSet<>(yourList); yourList.clear(); yourList.addAll(set);, но могу ' Я выяснил, как заставить его работать в моем коде. Знайте, что это, вероятно, простое решение, но я играл с ним и до сих пор не вернулся правильно ...

Кто-нибудь может сказать мне, где я ошибаюсь? По мнению всех, код выглядит так, как будто он должен работать ... Хотя это не так ...

SearchCityFragment

public class SearchCityFragment extends Fragment {

    private List<Post> mPostList;
    private Set<Post> mPostSet;
    private RecyclerView mRecyclerView;
    private CityAdapter mCityAdapter;

    private EditText mSearchBar;
    private RelativeLayout mRelativeLayout;
    private Activity mActivity;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_search_city, container, false);

        mRelativeLayout = view.findViewById(R.id.relative_layout_11);
        mRelativeLayout.setVisibility(View.VISIBLE);

        mRecyclerView = view.findViewById(R.id.recycler_view);
        mRecyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        mRecyclerView.setLayoutManager(linearLayoutManager);

        mPostList = new ArrayList<>();
        mCityAdapter = new CityAdapter(getContext(), mPostList);
        mRecyclerView.setAdapter(mCityAdapter);

        mSearchBar = mActivity.findViewById(R.id.search_bar);
        mSearchBar.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                searchCity(s.toString().toLowerCase());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        return view;
    }

    private void searchCity(String s) {
        Query query = FirebaseDatabase.getInstance().getReference("Posts").orderByChild("city").startAt(s).endAt(s + "\uf8ff");
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                mPostList.clear();
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Post post = snapshot.getValue(Post.class);
                    if (s.length() == 0) {
                        mPostList.clear();
                        mRelativeLayout.setVisibility(View.VISIBLE);
                    } else {
                        mRelativeLayout.setVisibility(View.GONE);
                        mPostList.add(post);
                        mPostSet = new HashSet<>(mPostList);
                        mPostList.clear();
                        mPostList.addAll(mPostSet);
                        readCity();
                    }
                }

                mCityAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    private void readCity() {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (mSearchBar.getText().toString().equals("")) {
                    mPostList.clear();
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        Post post = snapshot.getValue(Post.class);
                        mPostList.add(post);
                        mPostSet = new HashSet<>(mPostList);
                        mPostList.clear();
                        mPostList.addAll(mPostSet);
                    }

                    mCityAdapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        if (context instanceof Activity) {
            mActivity = (Activity) context;
        }
    }
}

1 Ответ

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

если вы хотите показать только сообщение с искомым городом и хотите показать только одно такое сообщение, вы можете просто запросить в базе данных сообщение с этим городом, вам не нужно создавать массив или хэш-карту.

                          private void searchCity(String s) {
                               FirebaseDatabase.getInstance()
                                     .getReference("Posts")
                                     .orderByChild("city")
                                     .startAt(s)
                                     .limitToFirst(1).
                                     .addValueEventListener(new ValueEvnetListener){
                                     @Override
                                     public void onDataChange(DataSnapshot 
                                     dataSnapshot) {
                                     // do your rhing
                                      }
                                    @Override
                               public void onCancelled(DatabaseError databaseError) {}
                                    } ;
}
...