如何返回2D字符串

时间:2017-12-29 15:29:48

标签: java sorting multidimensional-array hashmap

我不完全了解如何返回2D对象。所以我编写了一个方法,它接受带有文档的输入,我必须返回其中所有唯一单词的列表及其出现次数,按降序排列的出现次数排序。要求我无法控制它作为String的二维数组返回。

所以这就是我到目前为止:

static String[][] wordCountEngine(String document) {
    // your code goes here
    if (document == null || document.length() == 0)
        return null;

    Map<String, String> map = new HashMap<>();
    String[] allWords = document.toLowerCase().split("[^a-zA-Z]+");

    for (String s : allWords) {
        if (map.containsKey(s)) {

            int newVersion = (Integer.parseInt(map.get(s).substring(1, map.get(s).length())) + 1);
            String sb = Integer.toString(newVersion);
            map.put(s, sb);
        } else {
            map.put(s, "1");
        }
    }

    String[][] array = new String[map.size()][2];
    int count = 0;
    for (Map.Entry<String, String> entry : map.entrySet()) {
        array[count][0] = entry.getKey();
        array[count][1] = entry.getValue();
        count++;
    }

    return array;
}

我正在尝试使用HashMap存储单词及其出现次数。存储密钥的最佳方法是什么 - &gt;从表到String [] []的值对。 如果输入是:

input:  document = "Practice makes perfect. you'll only
                get Perfect by practice. just practice!"

输出应为:

output: [ ["practice", "3"], ["perfect", "2"],
      ["by", "1"], ["get", "1"], ["just", "1"],
      ["makes", "1"], ["only", "1"], ["youll", "1"]  ]

如何将这样的数据存储在2D数组中?

3 个答案:

答案 0 :(得分:7)

String[][]只是这项任务的错误数据结构。 在方法运行期间,您应该使用Map<String, Integer> map而不是<String, String>,只需返回该地图。

这有多种原因:

  • 你将存储整数作为字符串,甚至通过再次将String解析为整数,计算然后解析回来做计算 - 不好主意。
  • 返回的数组不保证尺寸,没有办法强制每个子数组只有两个元素。

关于您的评论的注意事项:如果(出于某种原因)您需要将地图转换为String[][],您当然可以这样做,但转换逻辑应该与生成映射本身的代码分开。这样,wordCountEngine的代码仍然干净且易于维护。

答案 1 :(得分:1)

仅仅因为您需要返回特定类型的数据结构并不意味着您需要在方法中创建类似类型的地图。没有什么可以阻止您使用Map<String, Integer>然后将其转换为String[][]

以下是不使用Java8 streeams的代码:

static String[][] wordCountEngine(String document) {
        // your code goes here
        if (document == null || document.length() == 0)
            return null;

        Map<String, Integer> map = new HashMap<>();

        for ( String s : document.toLowerCase().split("[^a-zA-Z]+") ){
            Integer c = map.get(s);
            map.put(s, c != null ? c + 1: 1);
        }

        String[][] result = new String[ map.size() ][ 2 ];

        int count = 0;
        for ( Map.Entry<String, Integer> e : map.entrySet() ){
            result[count][0] = e.getKey();
            result[count][1] = e.getValue().toString();
            count += 1;
        }

        return result;
    }  

为了获得Java8版本的乐趣:

static String[][] wordCountEngine(String document) {
    // your code goes here
    if (document == null || document.length() == 0)
        return null;

    return Arrays
    //convert words into map with word and count
    .stream( document.toLowerCase().split("[^a-zA-Z]+") )
    .collect( Collectors.groupingBy( s -> s, Collectors.summingInt(s -> 1) ) )
    //convert the above map to String[][]
    .entrySet()
    .stream().map( (e) -> new String[]{ e.getKey(), e.getValue().toString() } )
    .toArray( String[][]::new  );

}

答案 2 :(得分:0)

这是我对Pramp问题的解决方案,尽管在C#中,我认为这是相同的想法

findDupObjects = findDuplicates.map((s) =>
{
    let keyVal = s.split(':')
    let key = keyVal[0]
    let value = keyVal[1]
    var obj = {}
    obj[key] = value
    return obj
}); // <= [ {background-color: '#282c34'}, {display: 'flex'} ]