如何计算Android中ArrayList的连续值

时间:2017-04-12 07:10:54

标签: java android arraylist

我有一个ArrayList类型Boolean,我想要计算连续出现的True或False。

我的循环代码有效,但我很困惑如何处理第一个元素。我正在尝试执行以下操作:

 for(int i=0;i< Answers.size();i++) {
  if(Answers.get(i-1).booleanValue()= = Answers.get(i).booleanValue()) 
  ...

对于i=0,我当然会-1=0

如果我从i=1开始,我会遗漏第一个元素

那我怎么算数呢?

5 个答案:

答案 0 :(得分:1)

关键是:可能会有几个部分。所以你需要更复杂的东西。在那个意义上:

第一步是确定你到底要做什么&#34;输出&#34;这里。假设你有:

true, true, false, true, false, false, false, true, true, true

结果应该是什么?你想知道吗:

true: 2 (because there are is one subsequence with 2 values)

true: 2, 3 (because you got two sequences, one with 2, one with 3 values)

含义:您必须澄清您的要求,以准确理解您的代码必须执行的 ;之前你甚至应该考虑&#34;如何做到这一点&#34;!

关于具体问题:您只需要特殊检查,例如

if (i == 0) {
 then of course you can't do i--

但是如上所述:这只对你当前的循环有帮助;但它并没有帮助你解决真正的问题。因为你甚至没有定义你想做的事情!

答案 1 :(得分:1)

您可以使用状态机 - 您需要记住最后的答案和重复次数,当答案更改为相反值时您重置。像这样:

public class CountBooleans {
    public static void main(String[] args) {
        boolean[] answers = new boolean[20];

        answers[16] = true;
        answers[17] = true;
        answers[18] = true;

        countConsecutiveRepetitions(answers);
    }

    private static void countConsecutiveRepetitions(boolean[] answers) {
        boolean lastAnswer = answers[0];
        int repetitionCount = 0;

        for (boolean answer : answers) {
            if (answer == lastAnswer) {
                repetitionCount++;
            } else {
                System.out.println("There was: " + lastAnswer + " * " + repetitionCount);
                lastAnswer = answer;
                repetitionCount = 1;
            }
        }
        System.out.println("There was: " + lastAnswer + " * " + repetitionCount);
    }
}

将打印:

There was: false * 16
There was: true * 3
There was: false * 1

答案 2 :(得分:1)

我的java代码计算列表中的连续发生次数:

public static void main(String[] args) throws IOException {
        ArrayList<Boolean> fruit = new ArrayList<>();
        fruit.addAll(Arrays.asList(true, true, true, true, false, false, false, false, true,true,false,false,true,true,false));

        int trueCount = 0, falseCount = 0;
        List<Integer> trueCounts = new ArrayList<>();
        List<Integer> falseCounts = new ArrayList<>();
        for (int i = 0; i < fruit.size();) {
            Boolean value = fruit.get(i);
            while (i < fruit.size() && fruit.get(i)) {
                trueCount++;
                i++;
            }
            while (i < fruit.size() && !fruit.get(i)) {
                falseCount++;
                i++;
            }
            trueCounts.add(trueCount);
            falseCounts.add(falseCount);
            trueCount=0;
            falseCount=0;
        }
        System.out.println(trueCounts);
        System.out.println(falseCounts);
    }

打印:

[4, 2, 2]
[4, 2, 1]

答案 3 :(得分:0)

为了澄清关于起点的第一个问题,请尝试以下代码,该代码将比较连续位置的所有配对值:(0, 1), (1, 2) ... (n-2, n-1),其中n = answers.size()

for(int i = 1; i < answers.size(); i++) {
    if(answers.get(i-1).booleanValue() == answers.get(i).booleanValue()) {
    ...
    }
}

现在,...更加复杂。您必须跟踪truefalse个连续值之间的变化。

答案 4 :(得分:0)

这是你的答案,

for(int i=0;i< Answers.size();i++)
    {
        if (i > 0) {
          if(Answers.get(i-1).booleanValue()==Answers.get(i).booleanValue())
          {

          }
        }
    }

让我知道它是否适合您。我还有其他方法可以解决这个问题。