对于循环混淆,为什么不循环?

时间:2016-10-17 18:48:31

标签: java for-loop

所以我有一个方法,我传递一个ArrayList,这个方法的想法是获取输入并将每组匹配的字符串拆分成它们自己的单独列表。这里有一些伪代码。

Array = (a,a,a,b,c,d,d,e,e,e,e,e,f,f,s)

所以我想要这个算法是将这个数组拆分成一个具有相同元素的二维数组。像这样。

A[0][] = (a,a,a)
A[1][] = (b)
A[2][] = (c)
A[3][] = (d,d)
A[4][] = (e,e,e,e,e)
A[5][] = (f,f)
A[6][] = (s)

所以我试着把它放在一个for循环中,检查一个额外的元素,看看它是否不等于,然后它知道t

 int equalStringGroupIndex = 0;
    int i = 0;

    for(int first = 0, second = 0 ; input.get(first).equals(input.get(second)); second++){
        equalStringGroups[equalStringGroupIndex][i] = input.get(second);
        i++;
        //This if statment checks the element ahead then equals first = second, But when it jumps back to the top of the loop in the debugger it does'nt seem to check it even though in my Watches it's True
        if(!input.get(first).equals(input.get(second + 1))){
            equalStringGroupIndex++;
            i = 0;
            first = second;
        }
    }

为什么在添加第一组' a'之后它不循环?到2D数组 感谢。

更新: 感谢您的帮助,我决定采用HashMap路线。这就是我想出的。它似乎工作。

private HashMap<String, Integer> countDuplicates(ArrayList<String> input){

    HashMap<String, Integer> duplicates = new HashMap<>();

    //Value init loop, sets all values to 0;
    for (String s : input){
        Integer valueInitVar = 0;
        duplicates.put(s, valueInitVar);
    }

    //Increases the value by 1  each time the same key is encountered;
    for (String s : input){
        Integer tempDuplicateAmount = duplicates.get(s);
        //I could use the '++' operator but I feel ' var += 1' is much nicer to read;
        tempDuplicateAmount += 1;
        duplicates.put(s, tempDuplicateAmount);
    }

    return duplicates;
}

2 个答案:

答案 0 :(得分:1)

我建议别的东西:

List<List<Whatever>> splitSame(List<Whatever> input) {
  List<List<Whatever>> rv = new ArrayList<>();
  List<Whatever> currentValues = new ArrayList<>(); 
  Whatever lastChecked = input.get(0);
  for (Whatever what : input) {
    if (lastChecked.equals(what)) {
      currentValues.add(what);
    } else {
      rv.put(currentValues);
      currentValues = new ArrayList<>();
    }
    lastChecked = what;
  }
  rv.put(currentValues);
  return rv;

关键是:您可以轻松地遍历一个输入列表以收集子列表中的相等对象。最后,你只需把它们拉到一起。

我确信一些java8专家可以使用stream将上述内容重写为更简洁,更简单的内容。

根本不需要额外的双暗阵列复杂性!

(提示:代码刚刚写下来,可能包含错别字,当 last 元素不同时,那里有一个微妙的错误,但是:它是为了让你知道怎么做不同的东西;进一步的细节留给读者)

答案 1 :(得分:0)

如果您坚持这样做,我建议您将for循环中的条件更改为second < input.size (or length)

int equalStringGroupIndex = 0;
int i = 0;

for(int first = 0, second = 0 ; second < input.size(); second++){
    equalStringGroups[equalStringGroupIndex][i] = input.get(second);
    i++;

    if(!input.get(first).equals(input.get(second + 1))){
        equalStringGroupIndex++;
        i = 0;
        first = second+1;
    }
}

这样,你只在数组中循环,没有超出范围的例外。

我还将您的first = second更改为first = second+1,因为一旦您发现它们不相等,您应该将第一个索引设置为下一个索引,并通过first = second来设置您不是