Как получить количество повторяющихся элементов в массиве. Ява

# #java #android #arrays #sorting #firebase-realtime-database

#Ява #Android #массивы #сортировка #firebase-база данных в реальном времени

Вопрос:

Мне нужно получить количество записей за текущий день из базы данных. Записи в реальном времени Firebase находятся в метке времени, я анализирую их с помощью SimpleDateFormat.

Но я не смог получить количество записей, например, на сегодняшнюю дату. Скажи мне, что делать? Спасибо

ЗАПИСИ ИЗОБРАЖЕНИЙ В FIREBASE В РЕАЛЬНОМ ВРЕМЕНИ

 private void fetchDataWaterCount() {  currDate = null;  String uid = firebaseAuth.getUid();  if (android.os.Build.VERSION.SDK_INT gt;= android.os.Build.VERSION_CODES.O) {  currDate = LocalDate.now().toString();  }  waterRef = FirebaseDatabase.getInstance().getReference("Users").child(uid).child("body").child("water");  waterRef.addListenerForSingleValueEvent(new ValueEventListener() {  @Override  public void onDataChange(@NonNull DataSnapshot snapshot) {  if (snapshot.exists()) {  for (DataSnapshot ds : snapshot.getChildren()) {  waterModel = ds.getValue(WaterModel.class);  waterArray.add(waterModel);  waterModel.setWaterModelList(waterArray);  ArrayList listDate = new ArrayList();  for (int i = 0; i lt; waterModel.getWaterModelList().size(); i  ) {  long dateList = waterModel.getWaterModelList().get(i).getDate();  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US);  String dateFormat = formatter.format(new Date(dateList));  listDate.add(dateFormat);  if(listDate.contains(currDate)){  int water_count = (int) listDate.size();  drawable = getActivity().getDrawable(R.drawable.circut_progress_bar);  progressBar.setProgress(water_count);  progressBar.setMax(12);  progressBar.setSecondaryProgress(water_count);  progressBar.setProgressDrawable(drawable);  textViewWaterCount.setText(String.valueOf(water_count));  if (water_count gt;= 12) {  textViewWaterCount.setText("Done");  textViewWaterCount.setTextColor(getResources().getColor(R.color.colorGreen_900));  drawable = getActivity().getDrawable(R.drawable.circut_progressbar_green);  progressBar.setProgressDrawable(drawable);  }  }  }  }  }  }   @Override  public void onCancelled(@NonNull DatabaseError error) {   }  }); }  

Комментарии:

1. Можете ли вы проверить, что 2 строки датируются currDate и dateFormat совпадают в любой момент времени? Есть 2 причины listDate.contains(currDate) return false для этого . Просто нет совпадающей даты ИЛИ есть совпадающая дата, но она неправильно отформатирована, потому String что на данный момент вы просто сравниваете s.

2. Почему бы не использовать запрос с startAt(startOfTheDay) и endAt(endOfTheDay) ?

3. @avalerio Спасибо за ваш ответ. Я вижу в журналах listDate.contains(currDate) , что return true … Я проверил дату форматирования в массиве и в currDate . Это то же самое.

4. @AlexMamo Это хорошая идея! Я постараюсь. Спасибо

Ответ №1:

Если вы хотите знать количество WaterModels совпадений с определенной датой, вам нужно посчитать их по мере их появления.

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

 //Add this int dateCount = 0;  for (int i = 0; i lt; waterModel.getWaterModelList().size(); i  ) {  long dateList = waterModel.getWaterModelList().get(i).getDate();  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US);  String dateFormat = formatter.format(new Date(dateList));  listDate.add(dateFormat);    //Add this  if(dateFormat == currDate){  dateCount  ;  }    //I don't know what your doing here but this will return true  //if there is at least 1 match. You can't use this to track how many dates  //match  if (listDate.contains(currDate)) {  int water_count = (int) listDate.size();  drawable = getActivity().getDrawable(R.drawable.circut_progress_bar);  progressBar.setProgress(water_count);  progressBar.setMax(12);  progressBar.setSecondaryProgress(water_count);  progressBar.setProgressDrawable(drawable);  textViewWaterCount.setText(String.valueOf(water_count));  if (water_count gt;= 12) {  textViewWaterCount.setText("Done");  textViewWaterCount.setTextColor(getResources().getColor(R.color.colorGreen_900));  drawable = getActivity().getDrawable(R.drawable.circut_progressbar_green);  progressBar.setProgressDrawable(drawable);  }  } }  

dateCount будет содержать общее количество дат, которые соответствуют currDate .

Комментарии:

1. очень услужливо. Большое спасибо