-5
votes

Index de plusieurs valeurs max dans le tableau

J'ai un tableau de par exemple xxx

et problème est d'obtenir l'index de de multiples valeurs max à partir d'une matrice.


1 commentaires

Voulez-vous dire que vous voulez tous les index de chaque instance d'un numéro unique? Pouvez-vous modifier pour nous montrer votre tentative jusqu'à présent?


6 Réponses :


4
votes

D'abord Obtenir le MAX:

var indices = array.Select((x, i) => new { Index = i, Value = x })
    .Where(x => x.Value == max)
    .Select(x => x.Index);


1 commentaires

Compte tenu de la nature de la question, l'OP ne sait probablement même pas ce que LINQ n'est ni qu'elles ne peuvent l'utiliser. J'aurais attendu jusqu'à ce que nous ayons plus d'informations avant de répondre à quelque chose comme ça



1
votes

Avec une méthode d'extension indiquée que vous avez déjà la maxvalue que vous recherchez: xxx

Vous pouvez avoir: xxx


2 commentaires

iEnumerable ne contient pas de définition pour indexof . De plus, vous devez modifier vos méthodes Signature en Allindexesof (...) Pour fonctionner correctement. En plus de cela, j'aime beaucoup l'approche du rendement renvoyant toutes les valeurs.


@Felixb., La réponse originale était sur la liste que comme indice de. Je l'ai changé avec une vérification de la compatibilité. La variable est toujours la liste de noms.



2
votes

Voici comment vous pouvez le faire dans une boucle.

var indices = new List<int>();
int max = int.MinValue;
for(int i = 0; i < array.Length; i++)
{
    if(array[i] > max)
    {
        max = array[i];
        indices.Clear();
    }

    if(array[i] == max)
    {
        indices.Add(i);
    }
}


0 commentaires

0
votes

comme un compteur à la réponse de @ Himbrombeere

Nous pouvons utiliser un dictionnaire pour chaque numéro unique, puis une liste d'entiers pour chaque index qu'il a montré. p>

var intArray = new int[5];
var dictionary = new Dictionary<int, List<int>>();
for (int i = 0; i < intArray.Length; i++)
{
    var num = intArray[i];
    if (!dictionary.ContainsKey(num))
     {
        dictionary.Add(num, new List<int>());
     }

     dictionary[num].Add(i);
}

var max = dictionary.Keys.Max();
return dictionary[max];


4 commentaires

Vous avez raison, j'ai besoin explicitement itérer sur la valeur des clés


Oui, j'ai réparé le boîtier et la logique fixe derrière l'accès à la valeur de max. Toutes mes excuses pour l'attention laxe payée à cela.


Le principal problème est que cela fait plus que nécessaire. Je ne créerais qu'un dictionnaire comme si je devais réellement obtenir les index pour différentes valeurs, pas seulement le max.


Et si la liste est un milliard d'éléments? Dans les déclarations de LINQ ci-dessus, nous itionions toute la collection à plusieurs reprises. Le pire cas ici est itérant la liste une fois, ainsi que itérant le nombre de nombres uniques. Je suis d'accord c'est très terres mais ce n'est pas objectivement pire - éditer, je n'ai même pas vu votre réponse quand j'ai répondu à cela. Beaucoup plus succinct! Toutes mes excuses pour penser que vous avez répondu avec la réponse LINQ



1
votes

Approche LINQ

int[] array = new int[] { 1, 3, 2, 3 };

int[] result = array.Select((x, i) => new { index = i, value = x })
                    .GroupBy(x => x.value)
                    .OrderByDescending(x => x.Key)
                    .First()
                    .Select(x => x.index)
                    .ToArray();


0 commentaires

0
votes

Utilisation de retour de rendement code> et boucle via le tableau Vous pouvez le faire:

using Linq; // include this at the top of your file, if not already present.

// ...

int[] array = new int[] {1, 3, 2, 3};

IEnumerable<int> matchingIndexes = array.AllIndexesOf(array.Max());

// Convert to array if you need one
int[] matchingIndexesArr = matchingIndexes.ToArray();


3 commentaires

@fubo Merci pour la note, j'ai changé le code pour inclure le chèque si la valeur au i est la même que SearchValue


ElementAT est TRES IN-PRESSANT lors de l'utilisation d'une boucle, car elle iTère à nouveau la collection complète et à nouveau.


Eh bien, j'ai fait une erreur similaire que vous avez remarquée. Nous tendons oublier que iEnumerable est juste un brunch d'élément qui attend d'être itérer en paresseux. Il n'a aucune compréhension de l'index. Lorsque vous avez besoin d'index de conducteur, vous avez besoin de données de données de données prenant en charge le concept comme une liste ou une collection ou de leur inferface respectif.