如何获取数组中重复元素的计数。爪哇

Posted

技术标签:

【中文标题】如何获取数组中重复元素的计数。爪哇【英文标题】:How get counts of repeat elements in Array. Java 【发布时间】:2022-01-08 04:10:58 【问题描述】:

我需要从数据库中获取当天的记录数。 Firebase Realtime 中的条目是时间戳,我使用 SimpleDateFormat 解析它们。

但我无法获得记录数,例如今天的日期。告诉我该怎么做?谢谢

IMAGE RECORDS IN FIREBASE REALTIME

private void fetchDataWaterCount() 
    currDate = null;
    String uid = firebaseAuth.getUid();
    if (android.os.Build.VERSION.SDK_INT >= 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 < 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 >= 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) 

        
    );

【问题讨论】:

您能否验证,currDatedateFormat 两个字符串日期在任何时间点都相同?有两个原因listDate.contains(currDate)return false。根本没有匹配的日期,或者有一个匹配的日期,但格式不正确,因为此时您只是在比较 Strings。 为什么不使用startAt(startOfTheDay)endAt(endOfTheDay) 的查询? @avalerio 谢谢你的回答。我在日志中看到 listDate.contains(currDate) - return true。我检查了数组和 currDate 中的格式日期。这是一样的。 @AlexMamo 这是个好主意!我会尽力。谢谢 【参考方案1】:

如果您想知道与特定日期匹配的WaterModels 的数量,那么您需要在它们出现时对其进行计数。

您当前正在将每个日期添加到列表中,无论它是否与 currDate 匹配,因此您的计数是总日期而不是特定日期的具体数量。

//Add this
int dateCount = 0;

for (int i = 0; i < 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 >= 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 匹配的日期总数。

【讨论】:

非常有帮助。非常感谢

以上是关于如何获取数组中重复元素的计数。爪哇的主要内容,如果未能解决你的问题,请参考以下文章

如何在调用 AdapterFragment 之前正确填充数组?爪哇

如何从数组中获取随机元素[重复]

获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)

如何使用键在php中获取数组的第一个元素以及如何找到数组的第一个键[重复]

如何仅获取数组中的元素-mongodb [重复]

如何获取输入数组元素jquery的所有值[重复]