java—在arraylist中查找升序字符串的连续序列,并将它们分为两个arraylist

bybem2ql  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(283)

很直:
我试图使用compareto找到一个连续的字符串序列,并将它们保存到两个不同的arrayList中。
只有当下一个字符串在词典中等于或大于上一个字符串时,每个arraylist才应继续添加字符串。i、 e:如果arraylist包含[aaaaaaa,bbbbb,ccccc,aaaaaaa,bbbbb,aaaa,fffff],我希望它们将它们分成两个arraylist,如下所示:
arraylist 1包含连续升序字符串的第一个序列:[aaaaa,bbbbb,cccccc]。然后,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等等?

aamkag61

aamkag611#

我认为你应该使用递归

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()));
        }
    }
}
w9apscun

w9apscun2#

不知何故,你必须知道什么是当前的目标列表,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);
}

相关问题