问题描述
我有来自8个站的实时温度记录,用于科学研究。 只要所有8个站都采集了数据,就会将其按8列的数组进行推送。
例如下表
Time1 22 26 18 12 20 15 .. for 8 stations
Time2 20 26 15 13 20 18...
Time3 19 28 17 15 20 16 ...
Time1是最新的数据标签... Time2是前一个数据标签,依此类推。
在26号电台2重复26次
20 is repeated 3 times in station #5
所以预期的输出类似于以上两个句子。
我不是一个普通的(学习过的).js程序员,但是可以在系统上运行的主例程中修改代码。
谢谢。
解决方法
这是相当不错的算法,而且肯定可以更简单,但这是我的方法。
使用时间和温度创建一个二维数组。父数组将是times
,子数组将是temperatures
中的station
。每个子数组都有8个条目。该子数组中的每个位置都表示station
。
首先,您必须转换数据并为每个temperatures
创建station
组。
[
[22,20,19],[26,26,28],[18,15,17],...
]
遍历新集合并计算每个站阵列中temperatures
的重复项数。将每个工作站阵列转到您要计数的对象中。
[
{
"22": 1,"20": 1,"19": 1,},{
"26": 2,"28": 1,{
"18": 1,"15": 1,"17": 1,...
]
现在,由于您只想要重复项,因此可以过滤出每个站点低于1
的所有计数。并将所有内容都放入一个新数组中,该数组还会传递新数组中station
的数量。
[
[
2,{
"26": 2
}
],...
]
从这里您知道2
站已经记录了温度26
2
次。然后,您可以通过遍历结果将所有内容组合成一个字符串。
运行下面的代码片段以查看其运行情况。
// Make sure that your temp recordings are in a single array with
// arrays inside of it.
// Each position (left -> right) marking the index of the station.
const times = [
[22,18,12,17,[20,13,20],[19,28,16,18]
];
const getRepeatedTempsPerStation = times => {
// Get longest length of times array.
const length = Math.max(...times.map(time => time.length));
// Create a new array with the temps per station.
const tempsPerStation = [];
for (let i = 0; i < length; i++) {
tempsPerStation[i] = [];
for (let j = 0; j < times.length; j++) {
tempsPerStation[i].push(times[j][i]);
}
}
// Per station count how many times a single temp occurs.
const countsPerStation = tempsPerStation.map(temps =>
temps.reduce((acc,temp) => {
acc[temp] = (acc[temp] || 0) + 1;
return acc;
},{})
);
// Give each set of counts the number of the station and
// filter out all stations without any duplicate numbers.
const stationsWithRepeatedTemps = countsPerStation
.map((counts,index) => [index + 1,Object.fromEntries(
Object.entries(counts).filter(([temp,count]) =>
count > 1 && !isNaN(temp))
)])
.filter(([station,counts]) => Object.keys(counts).length > 0);
return stationsWithRepeatedTemps;
}
// Get the result.
const results = getRepeatedTempsPerStation(times);
// Loop over the result and output it in a string.
for (const [station,tempCounts] of results) {
for (const [temp,count] of Object.entries(tempCounts)) {
console.log(`${temp} is repeated ${count} times in station #${station}`);
}
}
此代码段还检查集合数组中的任何项目是否不是数字,因此如果某些数据没有通过并且传递了null
,就很好。