首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何返回2D字符串

如何返回2D字符串
EN

Stack Overflow用户
提问于 2017-12-29 23:29:48
回答 3查看 139关注 0票数 3

我不完全理解如何返回2D对象。因此,我编写了一个接受文档输入的方法,我必须返回其中所有唯一单词及其出现次数的列表,该列表按出现次数降序排序。这是一个要求,我不能控制将其作为字符串数组返回。

下面是我到目前为止所得到的:

代码语言:javascript
运行
复制
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来存储单词及其出现的位置。将表中的键-->值对存储到字符串中的最佳方法是什么?如果输入为:

代码语言:javascript
运行
复制
input:  document = "Practice makes perfect. you'll only
                get Perfect by practice. just practice!"

输出应为:

代码语言:javascript
运行
复制
output: [ ["practice", "3"], ["perfect", "2"],
      ["by", "1"], ["get", "1"], ["just", "1"],
      ["makes", "1"], ["only", "1"], ["youll", "1"]  ]

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

EN

回答 3

Stack Overflow用户

发布于 2017-12-29 23:33:58

对于这个任务,String[][]根本不是一个正确的数据结构。您应该在方法运行期间使用Map<String, Integer> map而不是<String, String>,并且只需返回该映射即可。

这有多个原因:

  • 您可以将整数存储为字符串,甚至可以通过再次将字符串解析为整数、计算然后再进行反向解析来进行计算-这不是一个好主意。
  • 返回的数组不保证维数,因此没有办法强制每个子数组只有两个元素。

注意您的注释:如果(出于某种原因)您需要将地图转换为String[][],您当然可以这样做,但转换逻辑应该与生成地图的代码本身分开。这样,wordCountEngine的代码就会保持整洁且易于维护。

票数 7
EN

Stack Overflow用户

发布于 2017-12-30 01:26:01

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

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

代码语言:javascript
运行
复制
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版本:

代码语言:javascript
运行
复制
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  );

}
票数 1
EN

Stack Overflow用户

发布于 2018-12-18 04:33:17

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

代码语言:javascript
运行
复制
   [TestMethod]
        public void PrampWordCountEngineTest()
        {

            string document = "Practice makes perfect. you'll only get Perfect by practice. just practice!";
            string[,] result = WordCountEngine(document);
            string[,] expected =
            {
                {"practice", "3"}, {"perfect", "2"},
                {"makes", "1"}, {"youll", "1"}, {"only", "1"},
                {"get", "1"}, {"by", "1"}, {"just", "1"}
            };
            CollectionAssert.AreEqual(expected,result);

        }
        public string[,] WordCountEngine(string document)
        {
            Dictionary<string, int> wordMap = new Dictionary<string, int>();
            string[] wordList = document.Split(' ');
            int largestCount = 0;
            foreach (string word in wordList)
            {
                string lowerWord = word.ToLower(); // can't assing to the same variable

                //remove special/punctuation characters
                var sb = new StringBuilder();
                foreach (var c in lowerWord)
                {
                    if (c >= 'a' && c <= 'z')
                    {
                        sb.Append(c);
                    }
                }
                string cleanWord = sb.ToString();
                if (cleanWord.Length < 1)
                {
                    continue;
                }
                int count = 0;
                if (wordMap.ContainsKey(cleanWord))
                {
                    count = wordMap[cleanWord];
                    count++;
                }
                else
                {
                    count = 1;
                }
                if (count > largestCount)
                {
                    largestCount = count;
                }
                wordMap[cleanWord] = count;
            }

            // we have a list of all of the words in the same length in a given cell of the big list
            List<List<string>> counterList = new List<List<string>>();
            for (int i = 0; i < largestCount + 1; i++)
            {
                counterList.Add(new List<string>());
            }
            foreach (var word in wordMap.Keys)
            {
                int counter = wordMap[word];
                counterList[counter].Add(word);
            }

            string[,] result = new string[wordMap.Keys.Count,2];
            int key = 0;
            //foreach list of words with the same length we insert the count of that word into the 2D array
            for (var index = counterList.Count-1; index > 0; index--)
            {
                var list = counterList[index];
                List<string> wordListCounter = list;
                if (wordListCounter == null)
                {
                    continue;
                }
                foreach (var word in wordListCounter)
                {
                    result[key, 0] = word;
                    result[key, 1] = index.ToString();
                    key++;
                }
            }
            return result;
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48024802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档