我怎样才能达到第一个 n Java 中字符串的字符,而不首先进行大小检查(内联是可以接受的)或冒着 IndexOutOfBoundsException?

有帮助吗?

解决方案

这是一个巧妙的解决方案:

String upToNCharacters = s.substring(0, Math.min(s.length(), n));

观点:虽然这个解决方案很“简洁”,但我认为它实际上是 可读性较差 比使用的解决方案 if / else 以显而易见的方式。如果读者还没有见过这个技巧,他/她必须 更加努力地思考 来理解代码。IMO,代码的含义在 if / else 版本。如需更清晰/更具可读性的解决方案,请参阅@paxdiablo 的答案。

其他提示

不要重新发明轮子...:

org.apache.commons.lang.StringUtils.substring(String s, int start, int len)

Java文档 说:

StringUtils.substring(null, *, *)    = null
StringUtils.substring("", * ,  *)    = "";
StringUtils.substring("abc", 0, 2)   = "ab"
StringUtils.substring("abc", 2, 0)   = ""
StringUtils.substring("abc", 2, 4)   = "c"
StringUtils.substring("abc", 4, 6)   = ""
StringUtils.substring("abc", 2, 2)   = ""
StringUtils.substring("abc", -2, -1) = "b"
StringUtils.substring("abc", -4, 2)  = "ab"

因此:

StringUtils.substring("abc", 0, 4) = "abc"

阿帕奇通用语言 有一个 StringUtils.left 方法用于此。

String upToNCharacters = StringUtils.left(s, n);

关于SO有一类问题有时不太有意义,这个问题非常接近:-)

也许您可以解释一下您对使用您排除的两种方法之一的厌恶。

如果只是因为您不想在代码中添加 if 语句或异常捕获代码,一种解决方案是使用辅助函数来为您处理它,例如:

static String substring_safe (String s, int start, int len) { ... }

它将事先检查长度并采取相应的行动(返回较小的字符串或用空格填充)。

那么你根本不必在代码中担心它,只需调用:

String s2 = substring_safe (s, 10, 7);

代替:

String s2 = s.substring (10,7);

这在您似乎担心的情况下有效(根据您对其他答案的评论),在进行大量字符串构建操作时不会破坏代码流程。

String upToNCharacters = String.format("%."+ n +"s", str);

可怕的是如果 n 是一个变量(因此您必须构造格式字符串),但如果是常量则非常清楚:

String upToNCharacters = String.format("%.10s", str);

文档

使用子串方法,如下:

int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);

正如一位评论者所指出的,如果 n 大于字符串的长度,这将引发异常。一个简单的解决方案是将所有这些包装在条件中 if(s.length()<n) 在你的 else 子句中,您可以选择是否只想打印/返回整个字符串或以其他方式处理它。

如果你足够幸运能够使用 Kotlin 进行开发,
您可以使用 take 实现您的目标。

val someString = "hello"

someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))

ApacheCommons 让我感到惊讶,StringUtils.abbreviate(String str, int maxWidth) 附加“...”没有更改后缀的选项。WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd) 查找下一个空白区域。

我将把它留在这里:

public static String abbreviate(String s, int maxLength, String appendToEnd) {
    String result = s;
    appendToEnd = appendToEnd == null ? "" : appendToEnd;
    if (maxLength >= appendToEnd.length()) {
        if (s.length()>maxLength) {
            result = s.substring(0, Math.min(s.length(), maxLength - appendToEnd.length())) + appendToEnd;
        }
    } else {
        throw new StringIndexOutOfBoundsException("maxLength can not be smaller than appendToEnd parameter length.");
    }
    return result;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top