0

非常直接:
我正在尝试使用 compareTo 查找连续的字符串序列并将它们保存到两个不同的数组列表中。
仅当下一个字符串在字典上等于或大于前一个字符串时,每个 ArrayList 才应继续添加字符串。即:如果 ArrayList 包含 [Aaaaa,Bbbbb,Ccccc,Aaaaa,Bbbbb,Aaaa,Fffff] 我希望他们将它们分成两个 ArrayList 为:
ArrayList 1 包含连续升序字符串的第一个序列: [Aaaaa,Bbbbb,Ccccc] . 然后,ArrayList 2 应该包含紧随其后的连续升序序列:[Aaaaa,Bbbbb],然后再次切换到 ArrayList 1 并附加下一个序列,所以现在 ArrayList 1 应该是:[Aaaaa,Bbbbb,Ccccc] + [Aaaa,Fffff] 等等。我试过这个:

static ArrayList<String> separateArray(ArrayList<String> list){
        ArrayList<String> F1 =  new ArrayList<String>();
        ArrayList<String> F2 = new ArrayList<String>();
        for(int i=0; i<list.size()-1;i++){
            if((list.get(i).compareTo(list.get(i+1))<=0))
                F1.add(list.get(i));
            
            F1.add(list.get(i+1));
            for(int j=i;j<list.size()-1;j++){
                if((list.get(j).compareTo(list.get(j+1))<=0))
                    F2.add(list.get(j));
                
            }
            
                
        }
}

我已经尝试了很多其他的事情和方法来完成这项工作,但我就是想不通。我怎样才能实现从添加到 F1 到 F2 再到 F1 等等的“切换”?

4

2 回答 2

0

不知何故,您必须知道当前的目标列表是什么,F1 或 F2。可能

  • 您写入的另一个变量ArrayList<String> current,您交替分配 F1 或 F2。
  • 一个布尔标志writingToF1,每次写入列表时,检查它,if(writingToF1) {F1.add} else {F2.add}切换序列时必须相应地设置它
  • 通过递归,使用方法参数来切换列表。

像这样。break不过看起来很丑。

static void separate(ArrayList<String> source, int currIndex, ArrayList<String> left, ArrayList<String> right) {
    for(int i=currIndex; i<source.size()-1;i++){
        // put stuff into left, when end of sequence reached continue with switched lists
        separate(source, i, right, left);
        break;
    }
}

static void separateArray(ArrayList<String> list) {
    ArrayList<String> F1 = new ArrayList<String>();
    ArrayList<String> F2 = new ArrayList<String>();

    separate(list, 0, F1, F2);
}
于 2020-11-15T10:18:06.873 回答
0

我认为你应该使用递归

static int compare(List<String> F, List<String> list, int segmentStart) {
    int i = segmentStart;
    for (i = segmentStart; i < list.size() - 1; i++) {
        if ((list.get(i).compareTo(list.get(i + 1)) <= 0)) {
            F.add(list.get(i));
        } else {
            F.add(list.get(i));
            break;
        }
    }
    // if list size is 1 or 2 then compare manually
    if (list.size() == 1) {
        F.add(list.get(0));
    // if list size is 2 then compare last F element amd last list element (first list elemrnt was compered in for loop)
    } else if (list.size() == 2 && (F.get(F.size() - 1).compareTo(list.get(i)) <= 0)) {
        F.add(list.get(i));
    }
    return i + 1;
}

static void separateArray(List<String> F1, List<String> F2, List<String> list) {
    int firstSegmentIndex = compare(F1, list, 0);
    if (firstSegmentIndex < list.size()) {
        int secSegmentIndex = compare(F2, list, firstSegmentIndex);
        if (secSegmentIndex + 1 <= list.size()) {
            separateArray(F1, F2, list.subList(secSegmentIndex, list.size()));
        }
    }
}
于 2020-11-15T10:28:46.250 回答