【问题标题】:Reorder Data in Log Files - Javascript重新排序日志文件中的数据 - Javascript
【发布时间】:2020-11-23 22:07:22
【问题描述】:

我正在尝试解决日志文件中的数据重新排序算法。

您有一组日志。每个日志都是一个以空格分隔的字符串。

对于每个日志,每个日志中的第一个单词是一个字母数字标识符。然后,要么:

标识符后面的每个单词将仅由小写字母组成,或者; 标识符后面的每个单词将仅包含数字。 我们将这两种日志称为字母日志和数字日志。保证每条日志的标识符后至少有一个单词。

重新排序日志,使所有字母日志都排在任何数字日志之前。字母日志按字典顺序排序,忽略标识符,标识符用于平局。数字日志应按其原始顺序放置。

返回日志的最终顺序。

例子:

Input: logs = ["dig1 8 1 5 1","let1 art can","dig2 3 6","let2 own kit dig","let3 art zero"]
Output: ["let1 art can","let3 art zero","let2 own kit dig","dig1 8 1 5 1","dig2 3 6"]

我的想法是为数字制作一张地图,为字母制作一张地图。我已经做了。然后,我需要对数字和字母进行排序,并将所有排序后的字母添加到我的答案数组中,并将所有排序后的数字添加到我的答案数组中。

var reorderLogFiles = function(logs) {
    if(!logs || logs.length === 0)
        return [];
    
    let numbers = {
        '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6,
        '7': 7, '8': 8, '9': 9
    };
    let digits = new Map();
    let letters = new Map();
    
    for(let i=0; i<logs.length; i++) {
        const log = logs[i].split(" ");
        if(numbers[log[1]] !== undefined) 
            digits.set(log[0], log.splice(1, log.length));
        else
            letters.set(log[0], log.splice(1, log.length));
    }
    
    // How can I sort letter and digits?
    
    let ans = [];
    for(const [key, value] of sortedLetters) {
        const temp = key + " " + value.join(" ");
        ans.push(temp);
    }
    for(const [key, value] of sortedDigits) {
        const temp = key + " " + value.join(" ");
        ans.push(temp);
    }
    
    return ans;
};

【问题讨论】:

    标签: javascript sorting dictionary


    【解决方案1】:

    我认为您可以稍微简化代码。首先,通过过滤原始日志创建数字和字母组;这可以通过首先拆分logs 中的所有值来简化。接下来,根据数组中的第二个值对字母进行排序,并将数字添加到排序后的数组的末尾。最后,join 将字符串重新组合在一起:

    const reorderLogFiles = logs => {
      // split values on first space
      logs = logs.map(v => v.split(/\s+(.*)/).filter(Boolean));
      // filter into digits and letters
      let digits = logs.filter(v => v[1].match(/^[\s\d]+$/));
      let letters = logs.filter(v => v[1].match(/^[a-z\s]+$/));
      // sort the letters
      letters.sort((a, b) => (c = a[1].localeCompare(b[1])) ? c : a[0].localeCompare(b[0]));
      // reassemble the list
      result = letters.concat(digits);
      // and convert back to strings
      result = result.map(a => a.join(' '));
      return result;
    }
    
    let logs = ["dig1 8 1 5 1", "let1 art can", "dig2 3 6", "let2 own kit dig", "let3 art zero"];
    console.log(reorderLogFiles(logs));
    logs = ["a1 9 2 3 1", "g1 act car", "zo4 4 7", "ab1 off key dog", "a8 act zoo", "a2 act car"];
    console.log(reorderLogFiles(logs));

    请注意,通过链接操作可以更紧凑地编写此代码,但我已将其写得更完整以便更容易理解。

    如果您不想使用正则表达式,您可以测试每个子字符串的第一个字符,看它是数字还是字母。例如:

    let digits = logs.filter(v => v[1][0] >= '0' && v[1][0] <= '9');
    let letters = logs.filter(v => v[1][0] >= 'a' && v[1][0] <= 'z');
    

    【讨论】:

    • 谢谢;但是,以下输入失败:["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo","a2 act car"]。输出应该是:["a2 act car","g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]
    • “字母日志按字典顺序排序,忽略标识符,标识符用于平局”我认为这是问题
    • @myTest532myTest532 - 抱歉,我错过了这一点。我已经更新了答案。
    • 谢谢。有没有办法在不使用正则表达式的情况下做到这一点?
    • @myTest532myTest532 当然,查看我的编辑,或查看stackoverflow.com/questions/8935632/…stackoverflow.com/questions/9862761/… 了解其他可能性
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2012-01-17
    • 2020-04-02
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多