在Java中交换数组元素的位置?

6

好的,这是我第一次在这里发布,所以请谅解。

我有一个名字的格式为"Smith, Bob I",我需要将此字符串转换为"Bob I. Smith"。你们有什么想法如何做到这一点?

这是我尝试过的一种方法,虽然它可以完成工作,但看起来很笨拙。

public static void main(String[] args) {
        String s = "Smith, Bob I.", r = "";
        String[] names;

        for(int i =0; i < s.length(); i++){
            if(s.indexOf(',') != -1){
                if(s.charAt(i) != ',')
                    r += s.charAt(i);
            }

        }
        names = r.split(" ");
        for(int i = 0; i < names.length; i++){
        }
        System.out.println(names[1] +" " + names[2] + " " + names[0]);


    }

你的算法可能会有一些依赖于输入规则的特殊情况,这可能需要额外的步骤来处理特殊情况或允许各种快捷方式,因为数据是一致的。例如:中间名是否总是存在,或者有时没有中间名或完整的中间名。像II或Jr这样的头衔呢?所有的名字都有名和姓吗?等等。 - Jessica Brown
好的,这是一个工具,它可以从非结构化文本或通过网络爬取收集到的姓名。它们以各种格式出现,例如“Bob I. Smith”,“Smith,Bob I”,“Bob Smith”,“Smith Bob”。我需要开发一种方法来使所有名称都成为统一的格式,目前的格式为“名字中间名 姓氏”或“姓氏,名字中间名”。 - Lambda
@Ninja-neer 嗯,如果不知道文本的格式,那就很难了。如果你不知道“Bob”和“Smith”的含义(计算机也不知道),你怎么区分“Smith Bob”和“Bob Smith”(即哪个是名字,哪个是姓氏)? - Thomas
我处理这个问题的方法是检查字符串中是否包含逗号。如果有逗号,那么很可能是“姓,名”的格式。但是,如果没有逗号,我还没有想出解决方案。 - Lambda
4个回答

10

如果名字总是<姓氏>, <名字>,可以尝试这样做:

String name = "Smith, Bob I.".replaceAll( "(.*),\\s+(.*)", "$2 $1" );

这将把Smith收集到1组中,Bob I.收集到2组中,然后在替换字符串中访问它们,分别用$1$2表示。由于表达式中的(.*)组,整个字符串都匹配并将被完全替换为替换字符串,该替换字符串只是交换了2个组,并用一个空格字符隔开。


据我所知,根据 OP 的要求:Smith, Bob I -> Bob I. Smith - 尽管我承认我没有添加句点,因为我不确定这是否是一个打字错误(在 OP 的代码中有句点)或者实际上是一个要求 - 不过很容易添加。 - Thomas
@userunknown 或者你有一个像素错误:I. + 像素错误可能看起来像 I, :P - Thomas
有些人看到一个问题就说:“我知道,我会用正则表达式。”现在他们的问题得到了解决,他们高兴地转向下一个问题。+1 - yshavit
这是我正在使用它的方式。该程序从非结构化文本中检索名称,并以接收到的格式显示它们。我想制作一个工具,以用户指定的格式显示它们,可以是“名字 中间名 姓氏”或“姓氏,名字 中间名”。 - Lambda

5
    String[] names = "Smith, Bob I.".split("[, ]+");
    System.out.println(names[1] + " " + names[2] + " " + names[0]);

4
final String[] s = "Smith, Bob I.".split(",");
System.out.println(String.format("%s %s", s[1].trim(), s[0]));

或者 System.out.printf("%s %s%n", s[1].trim(), s[0])); - Paul Vargas
1
@PaulVargas 你必须将println语句视为测试代码,真正的代码将返回该字符串。在你的示例中没有任何返回值。 - Marko Topolnik

3
String s = "Smith, Bob I.";
String result = s.substring(s.indexOf(" ")).trim() + " "
            + s.substring(0, s.indexOf(","));

"Bob I.Smith" 是我的结果。空格放错了位置。 - user unknown
对我来说,Bob 面前仍然是一片空白。 - user unknown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接