【问题标题】:Overlay Strings In Java While Skipping Spaces跳过空格时在Java中覆盖字符串
【发布时间】:2015-04-28 02:08:59
【问题描述】:

我想在 Java 中将两个字符串叠加在一起以生成一个字符串。我已经有一种方法来做这样的事情,但不完全是我想要的。

例如,如果我告诉它用" Hi" 覆盖"Hello World",我会得到" Hiorld"。

我希望能够用" Hi" 覆盖"Hello World",并得到"HelloHiorld"!

这是我目前使用的方法:

public static String overlayString(String str, String overlay, int start, int end) {
          if (str == null) {
              return null;
          }
          if (overlay == null) {
              overlay = "";
          }
          int len = str.length();
          if (start < 0) {
              start = 0;
          }
          if (start > len) {
              start = len;
          }
          if (end < 0) {
              end = 0;
          }
          if (end > len) {
              end = len;
          }
          if (start > end) {
              int temp = start;
              start = end;
              end = temp;
          }
          return new StringBuffer(len + start - end + overlay.length() + 1)
              .append(str.substring(0, start))
              .append(overlay)
              .append(str.substring(end))
              .toString();
      }

如果我希望该方法避免用空格替换字符,但仍保持文本的定位,该方法的外观如何?

【问题讨论】:

  • 您可能需要切换到逐个字符地遍历两个字符串的逻辑,如果它们是空格,则跳过覆盖字符串中的字符。
  • 即使我真的不想用这种逻辑编写方法,但我可能不得不这样做。

标签: java string methods


【解决方案1】:

您可以将第一个String 放入StringBuffer,使用循环检查第二个String 中的哪些字符不是空格,然后使用StringBuffer 的.replace() 方法替换这些字符。

例如,

StringBuffer sb = new StringBuffer("Hello World");
sb.replace(5, 7, "Hi");

给"HelloHiorld"

【讨论】:

  • 我可以举个例子吗?我想我知道该怎么做,但我不太确定。
【解决方案2】:

我可以通过两种方式来实现这样的目标......

首先...

public static String overlay1(String value, String with) {
    String result = null;
    if (value.length() != with.length()) {
        throw new IllegalArgumentException("The two String's must be the same length");
    } else {
        StringBuilder sb = new StringBuilder(value);
        for (int index = 0; index < value.length(); index++) {
            char c = with.charAt(index);
            if (!Character.isWhitespace(c)) {
                sb.setCharAt(index, c);
            }
        }
        result = sb.toString();
    }
    return result;
}

这允许您传递相同长度的Strings,并将替换第一个中第二个的所有“非空白”内容,例如...

overlay1("Hello World", 
         "      Hi   "));

或者您可以指定要覆盖String 的位置,例如...

public static String overlay2(String value, String with, int at) {
    String result = null;
    if (at >= value.length()) {
        throw new IllegalArgumentException("Insert point is beyond length of original String");
    } else {
        StringBuilder sb = new StringBuilder(value);
        // Assuming a straight replacement with out needing to 
        // check for white spaces...otherwise you can use
        // the same type of loop from the first example
        sb.replace(at, with.length(), with);
        result = sb.toString();
    }
    return result;
}

overlay2("Hello World", 
         "Hi", 
         5));

【讨论】:

  • 谢谢,这太完美了! (我将编辑并使用第一种解决方案。)第一种方法的唯一缺点是它们必须具有相同的长度,但如果它们的长度不同,我可以通过添加空格来解决这个问题。跨度>
  • @JohnDoe 这是我的限制,你“可以”合并这两个想法,为for-loop 提供一个“起点”开始,但这取决于你的需要;)跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多