当前位置: 首页 > 知识库问答 >
问题:

包含()方法不起作用

锺离赤岩
2023-03-14
private List<String> values = new ArrayList<String>();

public WhitespaceEqualsTest() {
    values.add("I ");
    values.add("I");
    values.add(". ");
    values.add(".");
    values.add("1");
    values.add("1 ");

    System.out.println(refine(values));
}

private List<String> refine(List<String> input){
    ArrayList<String> outerLoopValues = (ArrayList<String>) input;
    ArrayList<String> innerLoopValues = (ArrayList<String>) input;
    ArrayList<String> results = new ArrayList<String>();

    for(String string1 : outerLoopValues){
        for(String string2 : innerLoopValues){
            if(string1.contains(string2) == false){
                results.add(string1);
            }
        }
    }

    Set<String> temp = new HashSet<String>();
    temp.addAll(results);
    results.clear();
    results.addAll(temp);

    return results;
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((values == null) ? 0 : values.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    WhitespaceEqualsTest other = (WhitespaceEqualsTest) obj;
    if (values == null) {
        if (other.values != null)
            return false;
    } else if (!values.equals(other.values))
        return false;
    return true;
}

我已经覆盖了hashCode()equals(),所以我不太确定出了什么问题。它们是使用 Eclipse 生成的(来源 -

[1,., I,.,1]

共有3个答案

景哲
2023-03-14

将这些值添加到集合中。在集合中,任何情况下一个值出现一次,因此它是一个集合。;)

你不妨修改一下循环看看会发生什么

for(String string1 : outerLoopValues){
            for(String string2 : innerLoopValues){
                if(string1.contains(string2) == false){
                    results.add(string1);
                    System.out.println("added \"" + string1 + "\" since it does not contain \"" + string2 + "\"");
                }
            }
        }

给出以下输出:

added "I " since it does  not contain ". "
added "I " since it does  not contain "."
added "I " since it does  not contain "1"
added "I " since it does  not contain "1 "
added "I" since it does  not contain "I "
added "I" since it does  not contain ". "
added "I" since it does  not contain "."
added "I" since it does  not contain "1"
added "I" since it does  not contain "1 "
......
[1, . , I , I, ., 1 ]

如果它们不互相包含,就把它们加起来,我想这就是我们的想法?

然后通过Set推送List会删除重复项!请参见此处:向HashSet/HashMap添加重复值是否会替换先前的值

将循环中的条件从假更改为真会产生这种情况(在最后一行输出中使用Set/HashSet后没有变化!)

added "I " since it does contain "I "
added "I " since it does contain "I"
added "I" since it does contain "I"
added ". " since it does contain ". "
added ". " since it does contain "."
added "." since it does contain "."
added "1" since it does contain "1"
added "1 " since it does contain "1"
added "1 " since it does contain "1 "
[1, . , I , I, ., 1 ]

这回答了你的问题:它确实检测例如“I”是否包含“I”。

System.out.println("I ".contains("I"));

表示“正确”

希望这有帮助^^-d

黄浩涆
2023-03-14

字符串类是最终的。因此,您不能重写它的equals和hashCode方法。

private List<StringWrapper> values = new ArrayList<StringWrapper>();

public WhitespaceEqualsTest() {
    values.add(new StringWrapper("I "));
    values.add(new StringWrapper("I"));
    values.add(new StringWrapper(". "));
    values.add(new StringWrapper("."));
    values.add(new StringWrapper("1"));
    values.add(new StringWrapper("1 "));

    System.out.println(refine(values));
}

private List<StringWrapper> refine(List<StringWrapper> input){
    //no need to iterate the list
    //the set will automatically cancel out the duplicate
    Set<StringWrapper> temp = new HashSet<StringWrapper>(input);

    ArrayList<StringWrapper> results = new ArrayList<StringWrapper>();
    results.addAll(temp);
    return results;
}

创建String的包装类,然后重写equals和hashcode方法。

class StringWrapper {
    private String value;

    public StringWrapper(String value){
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
    @Override
    public String toString(){
        return value;
    }
    @Override
    public boolean equals(Object obj){
        boolean result = Boolean.FALSE;
        if(obj != null && obj instanceof StringWrapper){
            StringWrapper stringWrapper = (StringWrapper) obj;
            result = value.trim().equals(stringWrapper.getValue().trim());
        }
        return result;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((value.trim() == null) ? 0 : value.trim().hashCode());
        return result;
    }
}
阮桐
2023-03-14

如其中一条注释所述,您应该使用String包装器包装字符串并覆盖equals和hashcode方法。

我的解决方案基于“I”应该等于“I”的假设,因此只应将其中一个添加到结果中。

但是,我需要根据 Java 对象和 Java Arraylist 中的文档分别关于 equals包含实现 来补充它。哈希代码方法必须返回一个公共值。我已经在代码中将解释写成注释。如果有任何问题,请告诉我。

主要类别

public class StackOverflowMain
{
    private static List<String> values = new ArrayList<String>();

    public static void main(String[] args) {

        values.add("I ");
        values.add("I");
        values.add(". ");
        values.add(".");
        values.add("1");
        values.add("1 ");
        List<WhitespaceEqualsTest> toRefineList = new ArrayList<WhitespaceEqualsTest>();
        for (String value : values) {
            toRefineList.add(new WhitespaceEqualsTest(value));
        }

        System.out.println(refine(toRefineList));
    }

    private static List<WhitespaceEqualsTest> refine(List<WhitespaceEqualsTest> input) {
        ArrayList<WhitespaceEqualsTest> loopValues = (ArrayList<WhitespaceEqualsTest>) input;
        ArrayList<WhitespaceEqualsTest> results = new ArrayList<WhitespaceEqualsTest>();

        for (WhitespaceEqualsTest value : loopValues) {
            if (!results.contains(loopValues)) {
                results.add(value);
            }
        }

        Set<WhitespaceEqualsTest> temp = new HashSet<WhitespaceEqualsTest>();
        temp.addAll(results);
        results.clear();
        results.addAll(temp);

        return results;

    }
}

内部WhitespaceEqualsTest

class WhitespaceEqualsTest {
    private String value;

    public WhitespaceEqualsTest(String value) {
        this.value = value;
    }

    public void setString(String value) {
        this.value = value;
    }

    public String getString() {
        return this.value;
    }

    public int hashCode() {
        /*
         * Arraylist.contains is evaluated by using (o==null ? e==null : o.equals(e)) as mentioned in the javadoc
         * and Object.equals() would evaluate using hashcode() first to check if the object o is equal to object e
         * before calling .equals() method to evaluate.
         * 
         * As mentioned in java doc at http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#equals(java.lang.Object)
         * c1.equals(c2) implies that c1.hashCode()==c2.hashCode() should be satisfied
         * which is not in this question
         */      
        return 0;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        WhitespaceEqualsTest other = (WhitespaceEqualsTest) obj;
        if (value == null) {
            if (other.value != null)
                return false;
        } else if (!value.contains(other.value) && !other.value.contains(value)){ 
            /*
             * Does a checking on both ends since "I " contains "I" but "I" does not contain "I " due to the whitespace
             * For this question, if one of the condition satisfy it should be equal
             */
            return false;
        }           
        return true;
    }

    @Override
    public String toString() {
        return this.value;
    }
}

结果

[I , . , 1]
 类似资料:
  • 我正在使用R rticles包中的Elsevier模板在Rstudio中生成pdf文档。对于这篇论文,我想包括一个.png图像。当我加载图像时 工作正常,但当我将其更改为等效的knitr命令时(我更喜欢这个命令,因为它更容易设置fig大小等)。 我得到以下错误: 当我在rmarkdown中切换到pdf的标准输出设置时,输出:pdf_document,knitr选项确实起作用,所以我猜问题一定与rt

  • 我正在尝试从azure服务总线主题中读取消息,并使用C#的控制台应用程序显示它。我发现了很多他们正在使用的在线解决方案 当我试图在我的程序中使用相同的东西时,会得到红色的弯曲线,说明subscriptionclient不包含CreateFromConnection字符串的定义。我使用的是Microsoft.Azure.ServiceBus包。我在Microsoft.ServiceBus.Messa

  • 问题内容: 我正在学习有关Java的知识,并且一直困扰着这个问题:当我尝试使用简单的方法(例如)时,编译器给我错误。这是代码: 该方法在Javadoc中定义。 这样做应该很简单,但是我真的不知道我在做什么错。 问题答案: 您已经创建了自己的类,并且没有使用内置的Java类。您尚未定义。

  • 我的代码几乎准备好了,我只是不能解决一个简单的问题。我想在ArrayList中添加和识别码以及附加到它的项目。例如,括号只是为了明确我想做什么,它们不是代码或输出的一部分: 3ZU2SD34:老卷轴(-!添加) 9ZU5SD54:国际足联21(-!添加) 3ZU2SD34:老卷轴(-!未添加,ID已在列表中) 3ZU2SD34:最终幻想(-!未添加,ID已在列表中) 4ZU8SD89:NBA2K2

  • 我为javafx应用程序使用启动屏幕功能。我使用javafx ant任务按fx: jar、fx: signjar、fx:部署的顺序运行以生成jar文件、jnlp文件、html文件和包括“image”和“exe”在内的nativeBundle。双击打包在. jar文件中时,启动运行良好。但是,当我双击应用程序映像文件夹中的exe文件或通过运行. exe设置文件设置后的快捷方式时,没有启动屏幕。为什么

  • 以下脚本适用于: 我从Dwolla的支付API得到了预期的响应。为了使脚本更具动态性,我尝试将其更改为引用托管我希望信任的证书的目录。因此,我将最后一个选项()更改为: 但是,这会中断脚本,并且不会建立连接;错误是: SSL证书问题:无法获取本地颁发者证书 我知道目录是正确的,证书文件是有效的,因为原始脚本引用了同一目录中的证书。我希望扫描目录中的文件并找到它需要的证书,但这没有发生。为什么会这样