Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 代码重分解在最后不会给出相同的结果_Java - Fatal编程技术网

Java 代码重分解在最后不会给出相同的结果

Java 代码重分解在最后不会给出相同的结果,java,Java,我试图重写并重新分解下面的代码,但最后没有相同的结果(当我执行这两个函数时,列表VG不包含相同的结果)。 此外,我无法找出我下面的代码有什么问题。有人能告诉我如何保持列表中元素的顺序吗? 此函数的目标是删除andVars¬Vars列表的所有null或空字符串元素值+我的andVars¬Vars列表的字符串元素值中的所有重复元素 对于每个VARGOUP元素,保持andVars、notVars列表中元素的顺序。多谢各位 public static void RemoveDuplicate

我试图重写并重新分解下面的代码,但最后没有相同的结果(当我执行这两个函数时,列表VG不包含相同的结果)。 此外,我无法找出我下面的代码有什么问题。有人能告诉我如何保持列表中元素的顺序吗? 此函数的目标是删除andVars¬Vars列表的所有null或空字符串元素值+我的andVars¬Vars列表的字符串元素值中的所有重复元素 对于每个VARGOUP元素,保持andVars、notVars列表中元素的顺序。多谢各位

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