Java 排序内部列表长度不同的整数数组列表的数组列表
Ques:给定一组不同的整数S,返回所有可能的子集。子集中的元素必须按非降序排列。此外,子集应按升序词典顺序排序。 我的方法是:首先对输入进行排序。然后找到所有子集并将每个步骤中找到的新子集附加到res。现在我尝试使用自定义比较器对res arraylist进行排序。但产出出现了问题。 对于输入数组列表a={15,12,4} 输出:res={{},{4},{4,12},{4,15},{4,12,15},{12},{12,15},{15} 预期输出:res={{},{4},{4,12},{4,12,15},{4,15},{12},{12,15},{15}Java 排序内部列表长度不同的整数数组列表的数组列表,java,Java,Ques:给定一组不同的整数S,返回所有可能的子集。子集中的元素必须按非降序排列。此外,子集应按升序词典顺序排序。 我的方法是:首先对输入进行排序。然后找到所有子集并将每个步骤中找到的新子集附加到res。现在我尝试使用自定义比较器对res arraylist进行排序。但产出出现了问题。 对于输入数组列表a={15,12,4} 输出:res={{},{4},{4,12},{4,15},{4,12,15},{12},{12,15},{15} 预期输出:res={{},{4},{4,12},{4,12
为了对内部列表进行相互排序,我编写了这个比较器。但比较者给出了错误的答案。我想我的比较器写错了 您需要先对内部列表进行单独排序,然后再对外部列表进行排序 下面的代码片段对我很有用
Collections.sort(res, new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> p, List<Integer> q) {
Collections.sort(p);
Collections.sort(q);
return Integer.compare(p.get(0),q.get(0));
}
});
public class Stack1 {
private List<List<Integer>> outerList = null;
private List<Integer> innerList = null;
public static void main(String args[]) {
Stack1 stack1 = new Stack1();
List<Integer> fullList = new ArrayList<>();
fullList.add(15);
fullList.add(12);
fullList.add(4);
stack1.subsetsOfList(fullList);
System.out.println("Before Sorting");
stack1.printLists();
stack1.sortLists();
System.out.println("After Sorting");
stack1.printLists();
}
public void subsetsOfList(List<Integer> a) {
int i, j;
outerList = new ArrayList<>();
outerList.add(new ArrayList<Integer>());
Collections.sort(a);
for (i = 0; i < a.size(); i++) {
List<List<Integer>> str = new ArrayList<>();
for (List<Integer> al : outerList) {
innerList = new ArrayList<>();
innerList.addAll(al);
innerList.add(a.get(i));
str.add(innerList);
}
outerList.addAll(str);
}
}
public void printLists() {
for (List<Integer> list : outerList) {
System.out.println(list);
}
}
public void sortLists() {
Collections.sort(outerList, new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> t, List<Integer> t1) {
Collections.sort(t);
Collections.sort(t1);
for(int i = 0; i < t.size(); i++) {
if(t.size() > i && t1.size() > i) {
int result = Integer.compare(t.get(i), t1.get(i));
if(result != 0) {
return result;
}
} else if (t.size() > i && t1.size() < i) {
return 1;
} else if (t.size() < i && t1.size() > i) {
return -1;
}
}
return 0;
}
});
}
}
编辑:
请找到下面的代码,它为我工作
Collections.sort(res, new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> p, List<Integer> q) {
Collections.sort(p);
Collections.sort(q);
return Integer.compare(p.get(0),q.get(0));
}
});
public class Stack1 {
private List<List<Integer>> outerList = null;
private List<Integer> innerList = null;
public static void main(String args[]) {
Stack1 stack1 = new Stack1();
List<Integer> fullList = new ArrayList<>();
fullList.add(15);
fullList.add(12);
fullList.add(4);
stack1.subsetsOfList(fullList);
System.out.println("Before Sorting");
stack1.printLists();
stack1.sortLists();
System.out.println("After Sorting");
stack1.printLists();
}
public void subsetsOfList(List<Integer> a) {
int i, j;
outerList = new ArrayList<>();
outerList.add(new ArrayList<Integer>());
Collections.sort(a);
for (i = 0; i < a.size(); i++) {
List<List<Integer>> str = new ArrayList<>();
for (List<Integer> al : outerList) {
innerList = new ArrayList<>();
innerList.addAll(al);
innerList.add(a.get(i));
str.add(innerList);
}
outerList.addAll(str);
}
}
public void printLists() {
for (List<Integer> list : outerList) {
System.out.println(list);
}
}
public void sortLists() {
Collections.sort(outerList, new Comparator<List<Integer>>() {
@Override
public int compare(List<Integer> t, List<Integer> t1) {
Collections.sort(t);
Collections.sort(t1);
for(int i = 0; i < t.size(); i++) {
if(t.size() > i && t1.size() > i) {
int result = Integer.compare(t.get(i), t1.get(i));
if(result != 0) {
return result;
}
} else if (t.size() > i && t1.size() < i) {
return 1;
} else if (t.size() < i && t1.size() > i) {
return -1;
}
}
return 0;
}
});
}
}
您不应该只比较列表的第一个元素。当您将两个列表与相同的第一个元素进行比较时,会发生什么情况 为了缓解这个问题,您必须比较每个元素,直到达到差异。我建议如下:
int oneSize = listOne.size();
int twoSize = listTwo.size();
for(int i = 0; i < oneSize; i++)
{
if(i == oneSize || i == twoSize)
return oneSize - twoSize;
int elementOne = listOne.get(i);
int elementTwo = listTwo.get(i);
if(elementOne == elementTwo)
continue;
return Integer.compare(elementOne, elementTwo);
}
如果p.size为0会发生什么?如果你检查q.size==0,你也应该检查p。顺便说一句:使用ListisEmpty而不是.size==0无法复制。当我使用你的比较器时,我得到[12,15],[15]。如果p.get0==q.get0和另一个索引不同,那么预期的输出是什么?@YCF_L Oops!!更正了。现在重新检查。请重新检查我的帖子。请检查输入代码的输出:[[4],[12],[4,12],[15],[4,15],[12,15],[4,12,15]]工作正常。您不需要在comparator中对列表进行排序,因为它们已经按排序顺序排列。那么,为什么这种方法在这里可以比较第一项@GaurangSinghal您是否尝试过使用两个或多个具有相同第一项元素的列表的解决方案,但是不同的元素之后呢?我完全理解你的解决方法背后的逻辑和推理。我想问的是,我发布的链接中给出的解决方案是否正确?很抱歉造成混淆,我的意思是,你是否在适当的条件下尝试了你给我的链接中的解决方案?看来这个解决方案也会遇到同样的问题,因为它只检查列表的第一项。我同意。看到向上的投票和绿色的滴答声,我觉得我错过了什么。非常感谢。
int oneSize = listOne.size();
int twoSize = listTwo.size();
for(int i = 0; i < oneSize; i++)
{
if(i == oneSize || i == twoSize)
return oneSize - twoSize;
int elementOne = listOne.get(i);
int elementTwo = listTwo.get(i);
if(elementOne == elementTwo)
continue;
return Integer.compare(elementOne, elementTwo);
}