Java 代码重分解在最后不会给出相同的结果
我试图重写并重新分解下面的代码,但最后没有相同的结果(当我执行这两个函数时,列表VG不包含相同的结果)。 此外,我无法找出我下面的代码有什么问题。有人能告诉我如何保持列表中元素的顺序吗? 此函数的目标是删除andVars¬Vars列表的所有null或空字符串元素值+我的andVars¬Vars列表的字符串元素值中的所有重复元素 对于每个VARGOUP元素,保持andVars、notVars列表中元素的顺序。多谢各位Java 代码重分解在最后不会给出相同的结果,java,Java,我试图重写并重新分解下面的代码,但最后没有相同的结果(当我执行这两个函数时,列表VG不包含相同的结果)。 此外,我无法找出我下面的代码有什么问题。有人能告诉我如何保持列表中元素的顺序吗? 此函数的目标是删除andVars¬Vars列表的所有null或空字符串元素值+我的andVars¬Vars列表的字符串元素值中的所有重复元素 对于每个VARGOUP元素,保持andVars、notVars列表中元素的顺序。多谢各位 public static void RemoveDuplicate
public static void RemoveDuplicateListElements(List<VarGroup> vgs) {
if (vgs == null) {
return;
}
for (VarGroup vg : vgs) {
RemoveDuplicateListElements(vg.getOrVars());
if (vg.getAndVars() != null) {
for (int x = vg.getAndVars().size()-1 ; x >= 0; x--) {
if (vg.getAndVars().get(x) == null
|| vg.getAndVars().get(x).isEmpty())
{
vg.getAndVars().remove(x);
} else {
for (int y = 0; y < x; y++) {
if (vg.getAndVars().get(x).equals(vg.getAndVars().get(y))) {
vg.getAndVars().remove(x);
break;
}
}
}
}
}
if (vg.getNotVars() != null) {
for (int x = vg.getNotVars().size()-1 ; x >= 0; x--) {
if (vg.getNotVars().get(x) == null
|| vg.getNotVars().get(x).isEmpty())
{
vg.getNotVars().remove(x);
} else {
for (int y = 0; y < x; y++) {
if (vg.getNotVars().get(x).equals(vg.getNotVars().get(y))) {
vg.getNotVars().remove(x);
break;
}
}
}
}
}
}
}
public class VarGroup {
private List<String> notVars = new ArrayList();
private List<VarGroup> orVars = new ArrayList();
private List<String> andVars = new ArrayList();
public List<VarGroup> getOrVs() {
return this.orVars;
}
public void setOrVars(List<VarGroup> orVars) {
this.orVars = orVars;
}
public List<String> getAndVars() {
return this.andVars;
}
public void setAndVars(List<String> andVars) {
this.andVars = andVars;
}
public List<String> getNotVars() {
return this.notVars;
}
public void setNotVars(List<String> notVars) {
this.notVars = notVars;
}
}
publicstaticvoid-removeduplicatelistents(列表VG){
如果(vgs==null){
返回;
}
用于(变量组vg:vg){
移除的重复列表元素(vg.getOrVars());
if(vg.getAndVars()!=null){
对于(int x=vg.getAndVars().size()-1;x>=0;x--){
if(vg.getAndVars().get(x)=null
||getAndVars().get(x.isEmpty())
{
getAndVars().remove(x);
}否则{
对于(int y=0;y=0;x--){
if(vg.getNotVars().get(x)=null
||getNotVars().get(x.isEmpty())
{
getNotVars().remove(x);
}否则{
对于(int y=0;y
我的重构在这里:
public static void RemoveDuplicateListElements(List<VarGroup> vgs) {
if (vgs == null) {
return;
}
for (VarGroup vg : vgs) {
RemoveDuplicateListElements(vg.getOrVars());
if (vg.getAndVars() != null) {
vg.getAndVars().stream().distinct()
.filter(andVar -> Objects.nonNull(andVar) || !andVar.isEmpty())
.collect(Collectors.toList());
}
if (vg.getNotVars() != null) {
vg.getNotVars().stream().distinct()
.filter(notVar -> Objects.nonNull(notVar) || !notVar.isEmpty())
.collect(Collectors.toList());
}
}
}
publicstaticvoid-removeduplicatelistents(列表VG){
如果(vgs==null){
返回;
}
用于(变量组vg:vg){
移除的重复列表元素(vg.getOrVars());
if(vg.getAndVars()!=null){
vg.getAndVars().stream().distinct()
.filter(andVar->Objects.nonNull(andVar)| | |!andVar.isEmpty())
.collect(Collectors.toList());
}
if(vg.getNotVars()!=null){
vg.getNotVars().stream().distinct()
.filter(notVar->Objects.nonNull(notVar)| | |!notVar.isEmpty())
.collect(Collectors.toList());
}
}
}
重构方法中的此代码不起任何作用:
if (vg.getAndVars() != null) {
vg.getAndVars().stream().distinct()
.filter(andVar -> Objects.nonNull(andVar) || !andVar.isEmpty())
.collect(Collectors.toList());
}
它只是从列表中创建一个流,过滤该流,然后从过滤后的流中创建一个新列表。但这个新的列表随即被丢弃。您应该使用setAndVars
创建的筛选列表,或使用retainAll
修改现有列表
或者,如果您想使用streams和lambda,那么使用removeIf
怎么样?您可以使用Set
1)跟踪重复项。简单的例子:
List<String> lst = new ArrayList<>(Arrays.asList("foo", "bar", "foo", "blub", null));
Set<String> seen = new HashSet<>();
lst.removeIf(x -> x == null || ! seen.add(x));
listlst=newarraylist(Arrays.asList(“foo”、“bar”、“foo”、“blub”、null));
Set seen=新的HashSet();
lst.removeIf(x->x==null | |!seen.add(x));
1) 通常,您不应该在流中使用具有副作用的方法。我认为您应该在这里提取一些函数:
public static void removeDuplicateListElements(List<VarGroup> vgs) {
if (vgs == null) {
return;
}
for (final VarGroup vg : vgs) {
removeDuplicateListElements(vg.getOrVars());
handleVars(vg.getAndVars());
handleVars(vg.getNotVars());
}
}
private static void handleVars(final List<String> theVars) {
if (theVars != null) {
for (int x = theVars.size() - 1; x >= 0; x--) {
if (theVars.get(x) == null || theVars.get(x).isEmpty()) {
theVars.remove(x);
} else {
for (int y = 0; y < x; y++) {
if (theVars.get(x).equals(theVars.get(y))) {
theVars.remove(x);
break;
}
}
}
}
}
}
publicstaticvoid-removeduplicatelistents(列表VG){
如果(vgs==null){
返回;
}
用于(最终VARGOUP vg:vg){
移除的重复列表元素(vg.getOrVars());
扶手(vg.getAndVars());
扶手(vg.getNotVars());
}
}
专用静态真空扶手(最终清单){
if(theVars!=null){
对于(int x=theVars.size()-1;x>=0;x--){
if(theVars.get(x)==null | | theVars.get(x.isEmpty()){
取下(x);
}否则{
对于(int y=0;y
使用的方法(Intellij Idea):
- 选择
并为其提取一个变量vg.getAndVars()
- 选择
并为其提取一个变量vg.getOrVars()
- 收到关于重复代码的警告
- 选择标记为重复的第一个块并提取一个方法(接受IntelliJ建议以替换第二个块)
- 在前两步中提取的内联变量
- (奖励步骤:一些重命名)
for (int x = vg.getAndVars().size()-1 ; x >= 0; x--) {
// ...
for (int y = 0; y < x; y++) {
if (vg.getAndVars().get(x).equals(vg.getAndVars().get(y))) {
vg.getAndVars().remove(x);
break;
}
}
}
}
for(int x=vg.getAndVars().size()-1;x>=0;x--){
// ...
对于(int y=0;y