如何计算List <integer>中的重复项

时间:2017-05-02 14:25:59

标签: list sorting collections duplicates frequency

  

重复Count occurrences of words in ArrayList

我试图计算我的JSON响应的重复项。

我从1,2 ... to 13,14

获得了价值

首先我要做的是对列表进行排序:

Collections.sort(calues);

每个值可以使用4次。

所以最后我列出了1,1,1,1,2,2,2,2.....14,14,14,14

我需要计算重复的值,当任何值等1,2等重​​复值时,我需要向用户发送消息。

我怎么能这样做? 感谢您的帮助:)

继续教程我创建了这个:

 public int count(List<Integer> nums) {
    boolean inclump = false;
    int clumpcnt = 0;
    for (int i = 1; i < nums.size(); i++) {
        if (Objects.equals(nums.get(i), nums.get(i - 1)))  {
            if (!inclump) {
                inclump = true;
                clumpcnt++;
                if(clumpcnt ==3){
                    Utils.showToast(getApplicationContext(), "WOW VALUE REPEATED 3 TIMES, YOU WIN");
                }
            }
        } else {
            inclump = false;
        }
    }
    return clumpcnt;
}

但这计算了值,当值为2,2和3,3和4,4时,此函数输入

if(clumpcnt ==3){
                        Utils.showToast(getApplicationContext(), "WOW VALUE REPEATED 3 TIMES, YOU WIN");
                    }

我宣布了一个列表private List<Integer> cardsValues = new ArrayList<>();

然后我在这里添加了值:

开始申请时的前5位:

 @Override
 public void onNext(@NonNull Cards cards) {
  cardsArray = cards.getArrayCards();
 for (Card item : cardsArray) {
 imgUrls.add(item.getImage());
 cardsValues.add(item.getRank());

}    }

点击每次点击&#34;获取新卡&#34;

我使用相同的方法添加新值

for (Card item : cardsArray) {
imgUrls.add(item.getImage());
cardsValues.add(item.getRank());
}

在这里我称之为方法

private void checkDuplicateAchievement() {
 Collections.sort(cardsValues);
 count(cardsValues);
}

这是我的完整方法

private void getCards(final String deck_id, final int count) {
        cardApi.getCards(deck_id, count)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Cards>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {

                    }

                    @Override
                    public void onNext(@NonNull Cards cards) {
                        cardsArray = cards.getArrayCards();
                        for (Card item : cardsArray) {
                            imgUrls.add(item.getImage());
                            cardsValues.add(item.getRank());
                        }
                        cardsRecyclerView.notifyDataSetChanged();                    recyclerView.smoothScrollToPosition(cardsRecyclerView.getItemCount());

                        checkDuplicateAchievement();
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                    }
                });
    }

3 个答案:

答案 0 :(得分:3)

您可以使用如下的HashMap。 **没经过测试,很长一段时间后输入java!只是为了给你一个想法。

     public int count(List<Integer> nums) {
          Map<Integer, Integer> countMap = new HashMap<Integer, Integer>();
          for (int i = 1; i < nums.size(); i++) {
            if(countMap.get(nums[i]) != null){
              countMap.set(i, countMap.get(nums[i]) + 1) 
              if (countMap.get(i) >=3){
                 Utils.showToast(getApplicationContext(), "WOW VALUE REPEATED 3 TIMES, YOU WIN");
              }
            }else{
              countMap.set(i, 1)
            }
          }
     }

答案 1 :(得分:2)

试试这个:

public int count(List<Integer> nums) {
    boolean inclump = false; // Not used

    int clumpcnt = 0;
    int value = nums.get(0);
    for (int i = 1; i < nums.size(); i++) {
        if (Objects.equals(value, nums.get(i))) {
            clumpcnt++;
            if (clumpcnt == 3) {
                Utils.showToast(getApplicationContext(), "WOW VALUE REPEATED 3 TIMES, YOU WIN");
                Log.d("COUNT", "WOW VALUE " + String.valueOf(value) + " REPEATED 3 TIMES, YOU WIN");

                clumpcnt = 0;
            }
        } else {
            clumpcnt = 0;
            value = nums.get(i);
        }
    }

    return clumpcnt;
}

仅供参考, nums列表包含1,1,1,1,2,2,2,2,3,3,3,3

输出日志:

28078-28078/com.ferdous.stackoverflowanswer D/COUNT: WOW VALUE 1 REPEATED 3 TIMES, YOU WIN
28078-28078/com.ferdous.stackoverflowanswer D/COUNT: WOW VALUE 2 REPEATED 3 TIMES, YOU WIN
28078-28078/com.ferdous.stackoverflowanswer D/COUNT: WOW VALUE 3 REPEATED 3 TIMES, YOU WIN

答案 2 :(得分:1)

您可以对列表进行排序,然后循环排序的元素并比较相邻位置的值。如果它们匹配则存在重复项