java - 是否存在可以加入 ","和 "and"上的字符串列表的现有 Java 实用程序方法?

标签 java string utility-method

我正在寻找一些东西来增强 apache commons join() 函数的功能,基本上这将完成 makePrettyList() 所做的事情

public String makePrettyList(List<String> items) {
    String list = org.apache.commons.lang.StringUtils.join(items, ", ");
    int finalComma = list.lastIndexOf(",");
    return list.substring(0, finalComma) + " and" + list.substring(finalComma + 1, list.length());
}

makePrettyList(["Alpha", "Beta", "Omega"]) --> "Alpha, Beta 和 Omega"

最佳答案

[没有妥善处理尾随和前导空值/空值。现在效果更好。]

我的看法是,使用 Google Guava(不是官方 Java,而是一组非常好的软件包)。我提供它是因为您似乎考虑过使用 Joiner,但后来拒绝了它。因此,由于您曾经对使用 Joiner 持开放态度,也许您想再看一遍:

package testCode;

import java.util.List;

import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;

public class TestClass {

    Joiner joinComma = Joiner.on(", ");
    Joiner joinAndForTwo = Joiner.on(" and ");
    Joiner joinAndForMoreThanTwo = Joiner.on(", and ");

    public String joinWithAnd(List<String> elements) {
        ImmutableList<String> elementsNoNullsOrEmpties = new ImmutableList.Builder<String>()
                .addAll(Iterables.filter(elements, new Predicate<String>() {
                    @Override
                    public boolean apply(String arg0) {
                        return !Strings.isNullOrEmpty(arg0);
                    }
                })).build();

        if (elementsNoNullsOrEmpties.size() == 0) {
            return null;
        } else if (elementsNoNullsOrEmpties.size() == 1) {
            return Iterables.getOnlyElement(elementsNoNullsOrEmpties);
        } else if (elementsNoNullsOrEmpties.size() == 2) {
            return joinAndForTwo.join(elementsNoNullsOrEmpties);
        } else {
            final List<String> leadingElements = elementsNoNullsOrEmpties
                    .subList(0, elementsNoNullsOrEmpties.size() - 1);
            final String trailingElement = elementsNoNullsOrEmpties
                    .get(elementsNoNullsOrEmpties.size() - 1);
            return joinAndForMoreThanTwo.join(joinComma.join(leadingElements),
                    trailingElement);
        }
    }
}

和测试驱动程序:

package testCode;

import java.util.List;

import com.google.common.collect.Lists;

public class TestMain {

    static List<String> test1 = Lists.newArrayList();
    static List<String> test2 = Lists.newArrayList("");
    static List<String> test3 = Lists.newArrayList("a");
    static List<String> test4 = Lists.newArrayList("a", "b");
    static List<String> test5 = Lists.newArrayList("a", "b", "c", "d");
    static List<String> test6 = Lists.newArrayList("a", "b", "c", null, "d");
    static List<String> test7 = Lists.newArrayList("a", "b", "c", null);
    static List<String> test8 = Lists.newArrayList("a", "b", "", "", null, "c",
            null);
    static List<String> test9 = Lists.newArrayList("", "a", "b", "c", null);
    static List<String> test10 = Lists.newArrayList(null, "a", "b", "c", null);

    public static void main(String[] args) {
        TestClass testClass = new TestClass();

        System.out.println(testClass.joinWithAnd(test1));
        System.out.println(testClass.joinWithAnd(test2));
        System.out.println(testClass.joinWithAnd(test3));
        System.out.println(testClass.joinWithAnd(test4));
        System.out.println(testClass.joinWithAnd(test5));
        System.out.println(testClass.joinWithAnd(test6));
        System.out.println(testClass.joinWithAnd(test7));
        System.out.println(testClass.joinWithAnd(test8));
        System.out.println(testClass.joinWithAnd(test9));
        System.out.println(testClass.joinWithAnd(test10));
    }
}

输出:



一个
一个和一个
a、b、c、d
a、b、c、d
a、b、c
a、b、c
a、b、c
a、b 和 c

我喜欢这个,因为它不进行任何字符串拼接。它对提供的字符串列表进行分区,然后使用基于字符串元素数量的规则将它们正确地粘合在一起,而无需在事后回过头来反推“和”。我还处理出现在字符串列表开头、结尾或中间的空值/空值的各种边缘情况。可能是您保证不会发生这种情况,因此您可以简化此解决方案。

[我的和你的有点不同,当我正好有两个元素时,我不会在第一个元素之后和“and”之前放一个逗号,而对于三个或更多,有一个“和”前的逗号。这是一种风格。关于逗号的工作方式,您可以轻松地根据自己的喜好进行调整。]

关于java - 是否存在可以加入 ","和 "and"上的字符串列表的现有 Java 实用程序方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7852611/

相关文章:

java - 公共(public)代码的父类(super class)与实用程序类

android - 将对 Activity 的引用传递给实用程序类 android

java - 如何计算多维数组中包含零的列的数量

java - Hadoop:MapReduce MinMax 结果与原始数据集不同

java - 是否可以在 ImageIcon 中保持透明背景?

我可以在 for block 中使用 uint64_t 吗?

c++ - C++中如何将十六进制字符数组转换成字符串?

Java 基本同步线程

javascript - 用正则表达式替换第 n 个匹配项

C# 实用程序类 - 设置为一般用途并编译 w/o Main