Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重新排序日志文件中的数据-Javascript_Javascript_Sorting_Dictionary - Fatal编程技术网

重新排序日志文件中的数据-Javascript

重新排序日志文件中的数据-Javascript,javascript,sorting,dictionary,Javascript,Sorting,Dictionary,我正在尝试解决在日志文件中重新排序数据的算法 您有一个日志数组。每个日志都是一个以空格分隔的字符串 对于每个日志,每个日志中的第一个单词是字母数字标识符。然后,要么: 标识符后的每个单词将仅由小写字母组成,或; 标识符后的每个单词将仅由数字组成。 我们将这两种日志称为字母日志和数字日志。保证每个日志在其标识符后至少有一个字 重新排列日志,使所有字母日志位于任何数字日志之前。字母日志按字典顺序排列,忽略标识符,标识符用于领带。数字日志应按原始顺序放置 返回日志的最终顺序 例如: Input: lo

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

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

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

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


重新排列日志,使所有字母日志位于任何数字日志之前。字母日志按字典顺序排列,忽略标识符,标识符用于领带。数字日志应按原始顺序放置

返回日志的最终顺序

例如:

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;
};
var reorderLogFiles=函数(日志){
如果(!logs | | logs.length==0)
返回[];
让数字={
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6,
'7': 7, '8': 8, '9': 9
};
让数字=新映射();
让字母=新地图();

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

const reorderLogFiles=logs=>{
//在第一个空间上拆分值
logs=logs.map(v=>v.split(/\s+(.*)/).filter(布尔));
//过滤成数字和字母
让digits=logs.filter(v=>v[1]。匹配(/^[\s\d]+$/);
让letters=logs.filter(v=>v[1]。匹配(/^[a-z\s]+$/);
//把信分类
letters.sort((a,b)=>(c=a[1].localeCompare(b[1])?c:a[0].localeCompare(b[0]);
//重新整理清单
结果=字母.concat(数字);
//并转换回字符串
result=result.map(a=>a.join(“”));
返回结果;
}
let logs=[“dig1 8 1 5 1”、“let1艺术罐”、“dig2 3 6”、“let2自有工具挖掘”、“let3艺术零度”];
log(reorderLogFiles(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));
谢谢;但是,由于以下输入而失败:[“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”]“字母日志是按字典顺序排列的,忽略标识符,标识符用于领带”我认为这是issue@myTest532myTest532-抱歉,我没有说到这一点。我已经更新了答案。谢谢。有没有不使用regex的方法可以做到这一点?@myTest532myTest532当然,请参阅我的编辑,或者参阅和以了解其他可能性