【问题标题】:Returning words from a string array with symbols between them in java?java - 从字符串数组中返回单词,它们之间有符号?
【发布时间】:2017-11-05 17:25:54
【问题描述】:
public String onGoogleCommand(String[] args) {
    if(args.length == 0){
        return "Type in a question after the google command!";
    }
    if(args.length >= 1){
        return "https://www.google.com/#q=" + args[0] + "+" + args[1] + "+" + args[2];
    }
    return "What?";
}

我要问的是我说return "https://www.google.com/#q=" + args[0] + "+" + args[1] + "+" + args[2]; 的部分。显然,这可能不是编写搜索函数的最佳方式,但我如何才能自动执行此操作,以便 String[] args 中的单词自动放入我的 return 语句中,每个单词之间带有“+”,这样它会返回类似https://www.google.com/#q=please+help+me+with+this+question?

【问题讨论】:

  • 请注意:如果您正在构建一个 URL,请确保使用 URLEncoder 之类的东西正确转义特殊字符

标签: java arrays string bots discord


【解决方案1】:

虽然已经有一个公认的答案,但我给出了一些替代方案:

  1. Java 8 字符串连接

    如果您使用的是 Java 8,它已经提供了一个可以使用的连接方法:

    return "https://www.google.com/#q=" + String.join("+", args);
    

    (如果你使用的是Java

  2. 加入循环

    为此编写一个适当而简洁的循环也不难:

    StringBuilder result = new StringBuilder("https://www.google.com/#q=");
    boolean first=true;
    for (String arg : args) {
        result.append(first? "" : "+").append(arg);
        first = false;
    }
    return result;
    

    还有其他形式,正如评论中的某人似乎不喜欢布尔标志:

    StringBuilder result = new StringBuilder();
    for (String arg : args) {
        result.append(result.length() == 0 ? "https://www.google.com/#q=" : "+")
              .append(arg);
    }
    return result;
    

【讨论】:

  • 您不需要first 标志。相反,您可以简单地检查一次空的args 列表,如果不为空,则使用第一个参数为查询字符串播种。然后,通过添加 plus 后跟术语来迭代后续参数。
  • @TimBiegeleisen 这也是一个可行的选择。这只是我个人的选择,因为我觉得它更简洁易懂。如果您真的关心布尔标志,我提供了另一种形式。我宁愿使用与您不同的方式,因为我希望循环易于理解,而不是要求遍历“后续”元素
  • 这真的是效率问题;如果您不介意对每次迭代进行检查,那么您的解决方案就可以了。更大的问题是String#join() 的源代码内部发生了什么。现在我很好奇 Java 是如何处理它的。
  • @TimBiegeleisen 除非明显会影响效率(例如 string concat vs stringBuilder),否则我宁愿编写易于理解和维护的代码,而不是专注于这种过早的优化.
【解决方案2】:

通过使用Arrays.toStringreplace你可以达到你想要的结果

String array[] = {"please", "help", "me"};
String output = "https://www.google.com/#q=" + Arrays.toString(array).
                    replace("[", "").
                    replace("]", "").
                    replace(", ", "+");
System.out.println(output);

输出

 https://www.google.com/#q=please+help+me

【讨论】:

  • 虽然它有效,但我有点担心每次替换创建的临时字符串。
  • 我认为这个微不足道的例子不是问题,但是在处理更大或更频繁的情况时应该小心
  • 确实如此 :) 另一个问题是,如果任何字符串包含[], ,结果将被破坏。
【解决方案3】:

您可以使用以下方法:

public static String join(String[] array, String separator) {
    if (array == null) {
        return null;
    } else {
        if (separator == null) {
            separator = "";
        }

        if (array.length <= 0) {
            return "";
        } else {
            StringBuilder buf = new StringBuilder(array.length * 16);

            for (int i = 0; i < array.length; ++i) {
                if (i > 0) {
                    buf.append(separator);
                }

                if (array[i] != null) {
                    buf.append(array[i]);
                }
            }

            return buf.toString();
        }
    }
}

其实是从org.apache.commons.lang3;包导入的

例子:

public static String onGoogleCommand(String[] args) {
    if (args.length == 0) {
        return "Type in a question after the google command!";
    }
    if (args.length >= 1) {
        return "https://www.google.com/#q=" + join(args, "+");
    }
    return "What?";
}

【讨论】:

    【解决方案4】:

    您可以遍历 args[] 数组并构建您的查询字符串:

    public String onGoogleCommand(String[] args) {
        if(args == null || args.length == 0) {
            return "Type in a question after the google command!";
        }
        StringBuilder queryString = new StringBuilder("https://www.google.com/#q=");
        queryString.append(args[0]);
        for (int i=1; i < args.length; ++i) {
            queryString.append("+").append(args[i]);
        }
    
        return queryString.toString();
    }
    

    【讨论】:

    • StringBuilder queryString = new StringBuilder("https://www.google.com/#q="); queryString .append (args[0] ?
    • @ScaryWombat 帮助在登录前喝杯咖啡:~P
    【解决方案5】:

    您只需要使用一个 foreach 循环,这样就可以提供帮助:

    if(args.length >= 1){
        String finalStr="";
        for(String currentStr:args){
            finalStr+=currentStr+"+";
        }
        finalStr= finalStr.substring(0, finalStr.length()-1);
    }
    

    使用此代码,您将在 finalStr 中进行搜索,只需将其值附加到您的 URL,因为您可以看到符号“+”添加在每个元素之后,我总是删除最后一个元素(“+”),因为它是在字符串的末尾是不必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2014-05-28
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 2017-10-01
      • 2018-09-02
      相关资源
      最近更新 更多