【问题标题】:Populating an array using a different array but some of the values being inserted are null使用不同的数组填充数组,但插入的某些值是 null
【发布时间】:2020-02-28 01:36:16
【问题描述】:

我有一个字符串数组,我想用上述数组中最大的字符串填充另一个数组。我可以正确获取数组的大小并用正确数量的变量填充它,但是其中两个变量为空,而第三个是正确的值。

public static void main(String[] args) {
    String[] inputArray = {"aba", "aa", "ad", "vcd", "123"};
    String[] resultsArray = allLongestStrings(inputArray);


    for(String x: inputArray) {
        System.out.println("Input array: " + x);
    }

    for(String temp: resultsArray) {
        System.out.println("Results array: " + temp);
    }
}

public static String[] allLongestStrings(String[] inputArray) {
    int len = 0;
    for(String temp: inputArray) {
        if(temp.length() > len) {
            len = temp.length();
        }
    }
    String[] ret = new String[len];

    for(int i = 0; i <= inputArray.length-1; i++) {
        if(inputArray[i].length() == len) {
            ret[ret.length-1] = inputArray[i];
        }
    }


    return ret;
}

我的结果是:

Input array: aba

Input array: aa

Input array: ad

Input array: vcd

Input array: 123

Results array: null

Results array: null

Results array: 123

如何让这两个空值变成aba和vcd?

【问题讨论】:

    标签: java arrays string loops object


    【解决方案1】:

    您必须计算具有该长度的元素的数量。目前,您的代码分配了一个包含 len 元素数的结果数组。最长字符串的长度(代码中的len)与该长度的字符串数量无关。

    public static String[] allLongestStrings(String[] inputArray) {
        int len = 0;
        int num = 0;
        for (String temp : inputArray) {
            if (temp.length() == len) {
                num++;
            } else if (temp.length() > len) {
                len = temp.length();
                num = 1;
            }
        }
    
        String[] ret = new String[num]; // <-- allocate the right number of elements
    
        for (int i = 0, j = 0; i <= inputArray.length - 1; i++) {
            if (inputArray[i].length() == len) {
                ret[j++] = inputArray[i];
            }
        }
        return ret;
    }
    

    它遍历数组检查最长的字符串,同时保持我们目前看到的最长字符串的元素数量。在第一次迭代之后,您将知道将组成结果数组的元素数量,因此您可以分配正确的大小并填充它。


    另一种使用 Java 流的有趣方式:

    public static String[] allLongestStrings(String[] inputArray) {
        TreeMap<Integer, List<String>> lengthToStrings = Arrays.stream(inputArray)
                .collect(Collectors.groupingBy(String::length, TreeMap::new, Collectors.toList()));
    
        return lengthToStrings.lastEntry()
                .getValue()
                .toArray(new String[0]);
    }
    

    第一部分构造一个 TreeMap,它具有从 String 的长度到该长度的字符串列表的映射。由于它是按整数的自然排序(升序)排序的,我们可以通过读取最后一个条目来获得最大长度。该条目将具有该长度的所有字符串。

    最后一部分将List&lt;String&gt; 转换为String[] 并返回它。

    【讨论】:

    • 为什么不在第一个循环中放置一个 else-if? if (temp &gt; len) { len = temp.length(); num = 1; } else if (temp == len){ num++;}
    • @Eritrean 你是对的。我们可以避免第二次迭代。更新了答案:)
    【解决方案2】:

    这里是单循环解决方案。

    public static String[] allLongestStrings(String[] inputArray) {
        int len = 0;
        ArrayList<String> ret = new ArrayList<>(inputArray.length);
        for(String temp: inputArray) {
            if(temp.length() > len) {//reset list as bigger length is found.
                len = temp.length();
                ret.clear();
                ret.add(temp);
            }else if(temp.length()==len){//accumulate all longest Strings in the list
                ret.add(temp);
            }
        }
        return ret.toArray(new String[0]);
    }
    

    【讨论】:

      【解决方案3】:

      忽略与 max len 匹配的元素数量未正确计算的事实(但碰巧,在您的用例中,最大长度与该长度的元素数量匹配,即 3)。如果你真的需要一个数组,你可以使用 List 来移除大小限制并返回 retList.toArray()。

      回到真正的问题,你没有正确填充 ret 数组。您需要跟踪索引,而不是始终使用长度 -1 :

         for(int j=0,i = 0; i <= inputArray.length-1; i++) { // <-- See j declared here
              if(inputArray[i].length() == len) {
                  ret[j++] = inputArray[i]; // <--- See j++ usage instead of ret.length -1
              }
          }
      

      干杯!

      【讨论】:

        【解决方案4】:

        短 Java 8 版本:

            String[] inputArray = {"aba", "aa", "ad", "vcd", "123"};
        
            // find out the biggest element size
            Optional<String> biggest = asList(inputArray).stream().max(Comparator.comparing(String::length));
        
            // filter only element that contains the same size as the biggest one
            List<String> bigOnes = asList(inputArray).stream()
                    .filter(element -> element.length() == biggest.map(String::length).orElse(0))
                    .collect(Collectors.toList());
        
            // print them
            bigOnes.forEach(System.out::println);
        

        【讨论】:

          【解决方案5】:

          你的代码有几个问题:

          1. ret 数组的大小与len 的实际最大长度无关。
          2. 您只是将元素添加到 ret 数组的最后一个索引:
          ret[ret.length-1] = inputArray[i];
          

          因此,对于第一个问题,您可能希望在原始数组中保留一个最大长度字符串的count,并使用适当的索引指针解决第二个问题:

          public static String[] allLongestStrings(String[] inputArray) {
              int len = 0, count = 0;
              for(String temp: inputArray) {
                  if (temp.length() > len) {
                      len = temp.length();
                      count = 1;           // new max length, so reset count to 1
                  } else if (temp.length() == len) {
                      count++;
                  }
              }
              String[] ret = new String[count];
          
              for(int i = 0, j = 0; i < inputArray.length; i++) {
                  if (inputArray[i].length() == len) {
                      ret[j++] = inputArray[i];
                  }
              }
          
              return ret;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-05-22
            • 2012-01-01
            • 2019-06-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-30
            • 1970-01-01
            相关资源
            最近更新 更多