Je veux afficher les nombres qui ne s'affichent pas dans le tableau par plages, le tableau contient des nombres allant de 1 à 128.
par exemple pour le tableau [87,89,90,91,92,93 , 94,95,96,97,99]
Je veux imprimer 1-86, 88, 98, 100-128
J'ai écrit une fonction qui ne fonctionne que lorsqu'il y a aucun chiffre au milieu du premier nombre inutilisé et du dernier
function PrintPorts(ports) {
var portString = "";
var open = true;
let index = 1
for (; index < 129; index++) {
for (let j = 0; j < ports.length; j++) {
if (index == ports[j]) {
open = false;
break;
} else
open = true;
}
if (open) {
portString += index;
break;
}
}
for (; index < 129; index++) {
for (let j = 0; j < ports.length; j++) {
if (index == ports[j]) {
open = false;
break;
} else
open = true;
}
if (!open) {
portString += "-" + (index - 1) + ",";
}
}
if (index == 129 && open) portString += "-" + (index - 1);
return portString;
}
console.log(PrintPorts([87,89,90,91,92,93,94,95,96,97,99]));
voici le résultat 1-86, -88, -89, -90, -91, -92, -93, -94, -95, -96, -98, -128 pour l'exemple array
quand ce dont j'ai besoin est 1-86, 88, 98, 100-128
toute aide est appréciée
4 Réponses :
Tout d'abord, simplifiez votre code en utilisant la méthode includes () pour tester si un tableau contient un élément.
Ensuite, faites-le avec des boucles imbriquées. La boucle externe recherche le début d'une plage. Lorsqu'elle le trouve, la boucle interne recherche la fin de la plage. Testez si le début et la fin sont identiques pour décider s'il faut afficher un ou deux nombres avec - entre eux.
Et la meilleure façon de générer une chaîne délimitée par des virgules est en mettant les résultats dans un tableau, puis en utilisant join () à la fin pour les concaténer.
function PrintPorts(ports) {
var openPorts = [];
for (let index = 1; index < 129; index++) {
if (!ports.includes(index)) {
let startPort = index;
for (index = startPort + 1; index < 129; index++) {
if (ports.includes(index)) {
break;
}
}
let endPort = index - 1;
openPorts.push(startPort == endPort ? startPort : `${startPort}-${endPort}`);
}
}
return openPorts.join(",");
}
console.log(PrintPorts([87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99]));
console.log(PrintPorts([1, 2, 87, 89, 90, 91, 92, 93, 94, 95, 96, 97, 99, 120, 128]));
function PrintPorts(ports) {
let portString = "";
let start = 1;
let stop = 128;
ports.sort((a,b) => a-b)
for (let i in ports) {
if (start == ports[i] - 1){
portString += start + ","
}
else if(start < ports[i] - 1){
portString += start + "-" + String(ports[i]-1) + ",";
}
start = ports[i] + 1;
}
if (start < stop) {
portString += start + "-" + String(stop);
}
else if (start == stop) {
portString += stop;
}
else
portString = portString.substring(0, portString.length-1);
return portString;
}
console.log(PrintPorts([87,89,90,91,92,93,94,95,96,97,99]));
console.log(PrintPorts([1,3,87,89,90,91,92,93,94,95,96,97,99,128]));
console.log(PrintPorts([95,89,91,92,93,94,,87,96,97,90,99]));
ajoutez 0 au début, ajoutez 129 à la fin du tableau, parcourez les éléments, si la différence entre les éléments adjacents est de 2, alors imprimez ce qui se trouve entre les deux, s'il est supérieur à 2, affichez la plage.
Si le tableau n'est pas trié, triez d'abord le tableau, puis parcourez le tableau une fois et trouvez les plages manquantes en comparant la valeur précédente avec la valeur actuelle.
La solution ci-dessous contient également les lignes commentées pour le tableau des plages manquantes.
/ p>
Vous pouvez trouver le codepen de travail ici .
console.log(PrintPorts([87,89,90,91,92,93,94,95,96,97,99]))
function PrintPorts(ports) {
const sorted = ports.sort(function (p1, p2) {return p1-p2} );
const missingRanges = [];
let missingRangesStr = ''
let previous;
sorted.forEach(function(p, index) {
if(index == 0 && p > 1) {
missingRangesStr += (1 + ' - ' + (p - 1)) + ', ';
// missingRanges.push([1, p - 1]);
previous = p;
return;
}
if(index === (sorted.length - 1) && p !== 128) {
// missingRanges.push([p + 1, 128]);
missingRangesStr += (p + 1 + ' - ' + 128) + ', ';
previous = p;
return;
}
if(previous && (previous + 1) !== p) {
if((previous + 2) === p) {
missingRangesStr += (previous + 1) + ', ';
// missingRanges.push([previous + 1]);
} else {
missingRangesStr += (previous + 1) + '-' + (p - 1) + ', ' ;
// missingRanges.push([previous + 1, p - 1]);
}
}
previous = p;
});
return missingRangesStr.replace(/(,\s)$/, '');
}
Pas lié au problème, mais vous devriez utiliser
ports.includes (index)ouports.indexOf (index)! = -1plutôt que d'écrire votre propre boucle.