I.背景
そのようなAの需要があります:文字列が一定の長さを超えている場合、一部の長さは、上の楕円に置き換えられています。
多くの人々は、ほとんどのJavaベースの学生は、単純に書き出すことができますので、簡単にこれを見つけるでしょう。
だから我々は、この素朴な疑問を分析する必要があります。
第二に、コーディング
2.1アイデア
アイデアは非常に簡単です、それはサイズが小さい文字列の長さよりもあるかどうかが決定される、10未満の場合は、...過剰に置き換えることができます。
2.2エンコーディング
私たちは、より多くの配慮をエンコードしたいです:
- 堅牢性のために、我々はパラメータを確認したいです。
- また、完全な書き込みツールがカスタムアポストロフィをサポートできる場合。
私たちは、ツールを記述します。
import com.google.common.base.Preconditions;
import org.apache.commons.lang3.StringUtils;
public class StringUtil {
/**
* 超过 maxSize 的部分用省略号代替
*
* @param originStr 原始字符串
* @param maxSize 最大长度
*/
public static String abbreviate(String originStr, int maxSize) {
return abbreviate(originStr, maxSize, null);
}
/**
* 超过 maxSize 的部分用省略号代替
*
* @param originStr 原始字符串
* @param maxSize 最大长度
* @param abbrevMarker 省略符
*/
public static String abbreviate(String originStr, int maxSize, String abbrevMarker) {
Preconditions.checkArgument(maxSize > 0, "size 必须大于0");
if (StringUtils.isEmpty(originStr)) {
return StringUtils.EMPTY;
}
String defaultAbbrevMarker = "...";
if (originStr.length() < maxSize) {
return originStr;
}
return originStr.substring(0, maxSize) + StringUtils.defaultIfEmpty(abbrevMarker, defaultAbbrevMarker);
}
}
ここではプロジェクトは、これらのパッケージを導入していなかった場合コモンズ・lang3袋のStringUtils、および前提条件のグアバパッケージでは、あなたがあなた自身の手を得ることができ、非常に簡単です。
それが正しいかどうかを検証する方法を完成しましたか?
資格プログラムとして、書き込みユニットテストウェルに確認してください!
public class StringUtilTest {
@Test
public void abbreviateLess() {
String input = "123456789";
String abbreviate = StringUtil.abbreviate(input, 11);
Assert.assertEquals(input, abbreviate);
}
@Test
public void abbreviateCommon() {
String input = "123456789";
String abbreviate = StringUtil.abbreviate(input, 3);
Assert.assertEquals("123...", abbreviate);
}
@Test
public void abbreviateWithMarker() {
String input = "123456789";
String abbreviate = StringUtil.abbreviate(input, 3, "***");
Assert.assertEquals("123***", abbreviate);
}
@Test(expected = IllegalArgumentException.class)
public void abbreviateWithNegativeSize() {
String input = "123456789";
String abbreviate = StringUtil.abbreviate(input, -3);
}
}
ディスカバリーによる。
2.3思考?
そう超える場合は、それもあまりない値ではありませんか?
2.3.1最初の文字への傍受が問題になる場合、絵文字式は、2つの文字を占めた場合は?
テストへの単一のテスト、実際に問題を書きます。
優秀なプログラマーとして、および製品は、我々は、この場合は、どのようにそれを行うに何を共有するべきではないのですか?
製品の仮説はこう述べています。このような状況は、全体の表現はしないでください置きます。
変更を行うために私たちのユーティリティ機能:
/**
* 超过 maxSize 的部分用省略号代替
*
* @param originStr 原始字符串
* @param maxSize 最大长度
* @param abbrevMarker 省略符
*/
public static String abbreviate(String originStr, int maxSize, String abbrevMarker) {
Preconditions.checkArgument(maxSize > 0, "size 必须大于0");
if (StringUtils.isEmpty(originStr)) {
return StringUtils.EMPTY;
}
String defaultAbbrevMarker = "...";
if (originStr.length() < maxSize) {
return originStr;
}
// 截取前maxSize 个字符
String head = originStr.substring(0, maxSize);
// 最后一个字符是高代理项,则移除掉
char lastChar = head.charAt(head.length() - 1);
if (Character.isHighSurrogate(lastChar)) {
head = head.substring(0, head.length() - 1);
}
return head + StringUtils.defaultIfEmpty(abbrevMarker, defaultAbbrevMarker);
}
再実行ユニットテストは、私たちが望むどのような影響が判明しています。
Unicodeの詳細については、次の資料を参照してくださいウィキペディア、該当する文字の使用を参照してください。
https://www.ibm.com/developerworks/cn/java/j-unicode/
2.3.2どのように私は良く書くことができますか?
上記のアプローチは非常に完璧なように見えるが、それを書くためにどのようにより良いですか?何?それはまだ動作しませんか?!
私たちは次のようにソースコードコモンズ・lang3ののStringUtilsツールを見てみましょう。
/**
* <p>Returns either the passed in CharSequence, or if the CharSequence is
* empty or {@code null}, the value of {@code defaultStr}.</p>
*
* <pre>
* StringUtils.defaultIfEmpty(null, "NULL") = "NULL"
* StringUtils.defaultIfEmpty("", "NULL") = "NULL"
* StringUtils.defaultIfEmpty(" ", "NULL") = " "
* StringUtils.defaultIfEmpty("bat", "NULL") = "bat"
* StringUtils.defaultIfEmpty("", null) = null
* </pre>
* @param <T> the specific kind of CharSequence
* @param str the CharSequence to check, may be null
* @param defaultStr the default CharSequence to return
* if the input is empty ("") or {@code null}, may be null
* @return the passed in CharSequence, or the default
* @see StringUtils#defaultString(String, String)
*/
public static <T extends CharSequence> T defaultIfEmpty(final T str, final T defaultStr) {
return isEmpty(str) ? defaultStr : str;
}
見つけることができ、ソースは、パラメータの共通の戻り値が与えられ、それは特に使いやすいです。
私たちは、次のように変更しますので。
import com.google.common.base.Preconditions;
import org.apache.commons.lang3.StringUtils;
public class StringUtil {
/**
* 超过 maxSize 的部分用省略号代替
* <p>
* 使用范例:
* 1 不超过取所有
* StringUtil.abbreviate("123456789", 11) = "123456789"
* <p>
* 2 超过最大长度截取并补充省略号
* StringUtil.abbreviate("123456789", 3) = "123..."
* <p>
* 3 emoji表情被截断则丢弃前面的字符(整个表情)
* StringUtil.abbreviate("123456789??", 10) = "123456789..."
*
* @param originStr 原始字符串
* @param maxSize 最大长度
*/
public static String abbreviate(String originStr, int maxSize) {
return abbreviate(originStr, maxSize, null);
}
/**
* 超过 maxSize 的部分用省略号代替
* <p>
* 使用范例:
* <p>
* StringUtil.abbreviate("123456789"", 3, "***") = "123..."
*
* @param originStr 原始字符串
* @param maxSize 最大长度
* @param abbrevMarker 省略符
*/
public static String abbreviate(String originStr, int maxSize, String abbrevMarker) {
Preconditions.checkArgument(maxSize > 0, "size 必须大于0");
if (StringUtils.isEmpty(originStr)) {
return StringUtils.EMPTY;
}
String defaultAbbrevMarker = "...";
if (originStr.length() < maxSize) {
return originStr;
}
// 截取前maxSize 个字符
String head = originStr.substring(0, maxSize);
// 最后一个字符是高代理项,则移除掉
char lastChar = head.charAt(head.length() - 1);
if (Character.isHighSurrogate(lastChar)) {
head = head.substring(0, head.length() - 1);
}
return head + StringUtils.defaultIfEmpty(abbrevMarker, defaultAbbrevMarker);
}
}
最も良いプログラマは、我々が書いツールの時間を持って、あなたは共通の入力を置くことができ、出力ツールをノートに記載されている、ユーザーフレンドリー。
第三に、要約
この単純な機能は、ないので、簡単に書くために、達成することは容易です。
あなたは、コメント、表情プラス絵文字ハンドリングの問題で、パラメータの検証を追加するテストユニットを追加することができます。
多くの初心者は、常に問題の多くは非常に単純であると思うが、簡単な関数コードが厳しい書くことができ、それは質問の価値が検討しています。
また、私は、ソースコード、ソース・ノート、デザインパターンのソース、ソースコード記述されたアイデアを読んで、私たちは本質のソースコードのすべての側面を吸収できることを願っていますし、許可されたためにそれを取らない非常に貴重なものです。
ピンポイントニュアンスにプログラミング通常のプログラミングは良い習慣を開発し、追求するために優秀なプログラマーを行うために努力できるという希望を。