【问题标题】:How do I reverse every string in a string array?如何反转字符串数组中的每个字符串?
【发布时间】:2020-09-04 17:34:52
【问题描述】:
public static void reverse(String[] array){
    String reverse = "";
    for(int i=0;i<array.length;i++){
        for(int j = array[i].length() - 1; j >= 0; i--)
        {
            reverse = reverse + array[i].charAt(i);
        }
    }
}

使用此方法,我试图反转字符串数组中的每个字符串,但它只会引发异常。数组的长度和元素正在使用扫描仪输入。

public static String[] arrayStringCreation(String[] array){
        boolean isArrayInputStillGoing = true;
        while (isArrayInputStillGoing){
            System.out.println();
            System.out.println("Input the size of the array");
            int sizeOfArray = scanner.nextInt();
            if (sizeOfArray <= 0){
                System.err.println("Size can't be less than 1");
                continue;
            }
            array = new String[sizeOfArray+1];
            System.out.println("Input words less than 20 symbols");
            for(int i=0;i<sizeOfArray+1;i++){
                array[i] = scanner.nextLine();
                if (array[i].length()>20){
                    System.err.println("Try again with a word with less than 20 symbols");
                    i--;
                }
            }
            isArrayInputStillGoing=false;
        }
        return array;
    }

【问题讨论】:

  • 你的意思是array[i].charAt(j)?此外,您永远不会将反向重置为 ""
  • 仅供参考:char Java 中的类型已过时。请改用code point 数字。

标签: java arrays string for-loop


【解决方案1】:

这是另一种选择。它适用于大多数 Java 版本。它不是返回一个新的数组,而是简单地修改传递的数组。

public class ReverseStringsInArray {
    public static void main(String[] args) {
        String [] strArr = {"alpha", "beta","gamma","delta"};
        reversed(strArr);
        for (String v : strArr) {
            System.out.println(v);
        }
    }

    public static void reversed(String[] arr) {
        int k = 0;
        for (String v : arr) {
            int[] s = v.codePoints().toArray();
            int len = v.length();
            // swap the outer characters as the pointer moves
            // towards the middle
            for (int i = 0; i < len >> 1; i++) {
                int cp = s[i];
                s[i] = s[len - i - 1];
                s[len - i - 1] = cp;
            }
            arr[k++] = new String(s,0,s.length);
        }
    }
}

【讨论】:

    【解决方案2】:

    您可以使用Apace Commons 项目中的org.apache.commons.lang3 中的StringUtils.reverse。该方法处理null

    public static void reverse(String[] array) {
        for (int i = 0; i < array.length; i++) {
            array[i] = StringUtils.reverse(array[i]);
        }
    }
    

    【讨论】:

    • 它说“无法在 StringUtils 中解析方法反向”
    • 可能你没有导入StringUtils
    • @NotJhonWick45 此答案使用来自 Apache Commons 的库。您需要获取该库并添加到您的项目中才能使用此方法。
    【解决方案3】:

    您没有使用反向字符串更新数组并在内循环中递减j

        public static void reverse(String[] array) {
            String reverse;
            for (int i = 0; i < array.length; i++) {
                reverse = "";
                for (int j = array[i].length() - 1; j >= 0; j--) {
                    reverse += array[i].charAt(j);
                }
                array[i] = reverse;
            }
        }
    

    ,主要

        public static void main(String[] args) {
            String arr[] = { "head", "body", "hand" };
            reverse(arr);
            System.out.println(Arrays.toString(arr));
        }
    

    ,输出

    [daeh, ydob, dnah]
    

    【讨论】:

    • 是的,谢谢,我这样做了,但主要问题是我错误地输入了一个空数组,而不是我用扫描仪创建的数组。
    • 警告:此代码失败,超过一半的字符以 Unicode 定义。请参阅此代码 run live at IdeOne.com 的失败示例。 Java 中的 char 类型已过时。请改用 Unicode code point 数字。如需强大的解决方案,请参阅Answer by Elliott Frisch
    • @BasilBourque 我已经更正了问题中发布的代码,对于 ASCII 来说很简单
    • 只期望 ASCII 字符不太现实。所以只期待Basic Multilingual Plane 是不太现实的。即使忽略外语,使用某些符号和表情符号也会破坏此代码。在 2020 年,真的是时候学习如何使用代码点编号而不是 char 类型了。
    【解决方案4】:

    Answer by Elliott Frisch 正确且可靠,应该被接受。

    此外,为了好玩,这里有一个使用流的代码版本,而不是传统的for 循环。我声称这更好。

    我不知道数组流影响该数组的方法。所以我在这里创建并返回一个新数组。

    public static String[] reverse( String[] array ) {
        Objects.requireNonNull( array , "Received null argument where an array of `String` was expected. Message # b5c03336-4b9e-4735-a054-16e43aac059e.") ;
        
        Stream< String > stream = Arrays.stream( array ) ;
        String[] result =
                stream
                .map( ( String s ) -> new StringBuilder( s ).reverse().toString() )
                .toArray(String[]::new) 
        ;
        
        return result ;
    }
    

    用法。

        String arr[] = { "abc" , "def" , "mask?" } ;
        String arr2[] = Ideone.reverse( arr ) ;
        
        System.out.println( Arrays.toString( arr ) ) ;
        System.out.println( Arrays.toString( arr2 ) ) ;
    

    看到code run live at IdeOne.com

    [abc, def, 掩码?]

    [cba,喂,?ksam]

    【讨论】:

      【解决方案5】:

      StringBuilder::reverse

      只需迭代数组,并将每个条目替换为相反的条目。您可以使用StringBuilder 反转String,调用StringBuilder.reverse

      喜欢,

      public static void reverse(String[] array) {
          for (int i = 0; i < array.length; i++) {
              array[i] = new StringBuilder(array[i]).reverse().toString();
          }
      }
      

      然后进行测试

      public static void main(String[] args) {
          String arr[] = { "abc", "def" };
          reverse(arr);
          System.out.println(Arrays.toString(arr));
      }
      

      看到这个code run live at IdeOne.com

      [cba, 美联储]

      【讨论】:

      • 我尝试使用它,但我仍然在线程“main”java.lang.NullPointerException中得到相同的异常异常
      • @NotJhonWick45 那一定是因为数组中有空值。
      • 当我创建数组时,它会打印出内容,它们与我输入的内容相同,我看不到任何空值
      • @NotJhonWick45 堆栈跟踪的第一行应该准确地告诉您哪一行引发了 nullpointerexception。你确定这个方法是例外吗?发布一个可重现的示例。因为这段代码会反转String(s)。
      • 在 java.lang.StringBuilder.(StringBuilder.java:112)
      猜你喜欢
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多