首页 > 解决方案 > 如何从数组内部的字符串创建回文

问题描述

我应该将数组 arr 的每个元素更改为回文。

我尝试制作一个 for 循环来制作一个新数组,并制作另一个 for 循环来制作数组元素的回文,但显然它并没有真正奏效。

  public static String [] changeArrayToPalindrome(String [] arr){
  int length =arr.length;
  String[]newarray= new String[length];
  for(int i=0; i<length; i++){
     String a=arr[i];
     int n=a.length();
     if(a==null){
        System.out.println("null");
     }
     else if(a.equals("")){

      System.out.println("");
        }


     String newString="";
     for(int j=0; j<=n/2-1; j++){        

        newString+=a.charAt(j);
        newString+=a.charAt(n/2+j);

        newarray[j]=newString;
     }

  }
  return newarray;
   }   

测试仪是

String [] array={"street", null, "break", "oha", "", "pit", null,"atOyotA"};
System.out.println(Arrays.toString(changeArrayToPalindrome(array)));

应该打印出来

  //[street, null, break, oha, , pit, null, atOyotA]
  //[strrts, null, brerb, oho, , pip, null, atOyOta]   

我知道我不应该将 System.out.println 用于 null 或空字符串,但我不知道如何将其作为 return 语句。

任何有助于实现任务目的的帮助将不胜感激。

标签: java

解决方案


这是一个更简单的方法:

public static void main(String[] args) {
        String[] strings = {"abc", null, "abcdef"};
        List<String> collect = Arrays.stream(strings)
                .map(s -> s == null ? s : s.substring(0, (s.length() + 1) / 2) + reverseStringForPalin(s.substring(0, s.length() % 2 == 0 ? (s.length() + 1) / 2 : ((s.length() + 1) / 2) - 1)))
                .collect(Collectors.toList());
        System.out.println(collect);
    }

    private static String reverseStringForPalin(String s) {
        StringBuilder stringBuilder = new StringBuilder(s);
        return stringBuilder.reverse().toString();
    }

如果您不想使用StringBuilder

private static String reverseStringForPalin(String s) {
        String reversed = "";
        for (int i = s.length() - 1; i >= 0; i--) {
            reversed += s.charAt(i);
        }
        return reversed;
    }

更新

基本上map所做的是将一个对象转换为另一个对象。但是,如果您不想使用它,只需将其转换streams为传统的for

public static void main(String[] args) {
        String[] strings = {"abc", null, "abcdef"};

        String[] output = new String[strings.length];
        for (int i = 0; i < strings.length; ++i) {
            if (strings[i] == null) {
                output[i] = null;
            } else {
                final String s = strings[i];
                output[i] = s.substring(0, (s.length() + 1) / 2) + reverseStringForPalin(s.substring(0, s.length() % 2 == 0 ? (s.length() + 1) / 2 : ((s.length() + 1) / 2) - 1));
            }
        }

这是子字符串的代码(直接来自Java):

public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
    }

推荐阅读