【问题标题】:Java check if something was added to a stringJava 检查是否将某些内容添加到字符串中
【发布时间】:2018-05-14 17:56:53
【问题描述】:

我会定期检查我从 Web 服务获取的字符串是否更改。这工作得很好,但如果从我的方法触发器中删除旧字符串,也是。 例如:

//I get this at the beginning
"One,Two,Three"

//And at the next check I get this
"Two,Three"

所以字符串改变了,我的方法返回了 true,就像它应该做的那样。 但我只想返回真,例如“四”被添加到字符串中。

谁能给我一个解决这个问题的方法?

非常感谢,

冻结

【问题讨论】:

  • 无法理解您的问题。能说的清楚点吗?
  • 我得到字符串“一,二,三”,如果我向该字符串添加一些内容,但当我删除一些内容时,我想返回 true。所以: "一、二、三、四" //这将返回真 "二、三、四" //这也将返回真 "四、五、六" //这也将返回真 "二、三" //这应该返回false
  • Java String 是不可变的,究​​竟是如何添加了一些东西?您可以测试参考是否更改...a != b(这通常不是比较String 实例的方式)。甚至a.hashCode() != b.hashCode() - 这可能已经足够好了。
  • 嗯,它不是“添加”的。它基本上是一个新的字符串,它可以包含比原始字符串更少、相同或更多的信息。
  • @FreezedHD 看来你在这里有一个模式。你总是有三个值,用逗号分隔。所以你可以拆分你的字符串并检查它的长度是否小于 3。如果小于,则返回 false。

标签: java string return


【解决方案1】:

类似

newString.contains(oldString) && !newString.equals(oldString)

【讨论】:

  • 这行不通。 "Two,Three" 不会包含 "One,Two,Three"
  • 你的想法的问题是新字符串不必包含旧字符串。我可以得到类似“四、五、六”的东西:/
  • 很遗憾没有。这样做的原因是,如果添加了某些内容,我只想返回 true。如果我从字符串中删除某些内容,此解决方案也将返回 true :/
【解决方案2】:
if (!oldstring.contains(newstring)))  
return true;

【讨论】:

  • 但新字符串不必比旧字符串长
  • @FreezedHD 这应该很好,或者你有更多的测试用例:)
【解决方案3】:

为什么不只是在字符串长度增加时触发?该问题并未说明添加的内容是否重要——仅说明是否添加了某些内容。

boolean result = false;

if(newString.length() > oldString.length()) {
    result = true;
    break;
}

return result;

编辑:根据进一步的说明,我知道字符串的长度不是最好的指标,因为可以同时删除和添加一些东西,在这种情况下,OP 希望返回 true——即使长度更短。这是一个将字符串拆分为标记的解决方案,然后检查旧字符串的最后一个标记是否出现在新字符串的最后一个标记之前,因为这意味着在它之后添加了一些东西:

boolean result = false;
String delim = ",";
String oldStringTokens[] = oldString.split(delim);
String newStringTokens[] = newString.split(delim);

for(int i = 0; i < newStringTokens.length; i++) {
    if(oldStringTokens[oldStringTokens.length-1].equals(newStringTokens[i])) {
        if(i < newStringTokens.length - 1) {
            result = true;
        }
    }
}

return result;

【讨论】:

  • 但如果从字符串中删除了某些内容,我不想返回 true
  • 如果项目添加到最后一项以外的其他位置,您的更新答案将不起作用。请查看我的答案。
  • 在几处澄清中,OP 并未表明可以将数据添加到字符串末尾以外的任何位置。
  • 这提供了较少的开销,但如果数据被添加到其他地方当然不会起作用。
  • OP 在对其原始帖子的评论中进行了澄清。但是,是的,这适用于所有新项目都添加到字符串末尾的情况。
【解决方案4】:

也许你可以像这样使用split

public class MyClass {
    public static void main(String args[]) {
        String oldString = "This,Is,A,Test";
        String[] oldItems = oldString.split(",");

        String newString = "This,Is,A,New";
        String[] newItems = newString.split(",");

        // For each new item, check all old items
        for (String newItem: newItems)
        {
            Boolean foundItem = false;
            for (String oldItem: oldItems)
            {
                // Item was already in the old items
                if (newItem.equals(oldItem))
                {
                    foundItem = true;
                    break;
                }
            }
            // New item is not in the old list of items
            if (!foundItem)
            {
                System.out.println("New item added: " + newItem);
            }
        }
    }
}

【讨论】:

  • 从来没有想过使用 for 循环来比较两个字符串。好点子。我会试试这个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2014-09-25
  • 1970-01-01
  • 2014-05-07
  • 2018-05-01
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多