SORT ARRAY, COM CLASSIFICAÇÃO COM POSTOS

 Tópico anterior Próximo tópico Novo tópico

SORT ARRAY, COM CLASSIFICAÇÃO COM POSTOS

C#

 Compartilhe  Compartilhe  Compartilhe
#482003 - 29/05/2018 18:58:22

WCOSTA
VASSOURAS
Cadast. em:Dezembro/2003


Membro da equipe

Última edição em 29/05/2018 19:57:14 por WCOSTA

Tenho o seguinte código que peguei em https://msdn.microsoft.com/pt-br/library/6tf1f0bc(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2, com adaptações. Até aí tranquilo a ordenação, mas o problema é que no Output o Ranqueamento não fica de acordo com meu propósito e eu confesso que não tenho ideia de como fazer, pois estou entrando em C# agora e preciso desse código para dar seguimento ao projeto.

  using System;
using System.Collections;

public class ReverseComparer : IComparer  
{
   // Call CaseInsensitiveComparer.Compare with the parameters reversed.
   public int Compare(Object x, Object y)  
   {
       return (new CaseInsensitiveComparer()).Compare(y, x );
   }
}
public class Example
{
   public static void Main()  
   {
      // Create and initialize a new array.
      String[] words = { 7, 6, 3, 5, 5, 9, 1, 2, 5, 3, 4, 5, 6};
      // Instantiate the reverse comparer.
      IComparer revComparer = new ReverseComparer();

      // Display the values of the array.
      Console.WriteLine( "The original order of elements in the array:" );
      DisplayValues(words);

    

      // Sort the entire array using the default comparer.
      Array.Sort(words);
      Console.WriteLine( "After sorting the entire array by using the default comparer:");
      DisplayValues(words);
   }

   public static void DisplayValues(String[] arr)  
   {
      for ( int i = arr.GetLowerBound(0); i <= arr.GetUpperBound(0);
            i++ )  {
         Console.WriteLine( "   [{0}] : {1}", i, arr[i] );
      }
      Console.WriteLine();
   }
}
//Output
The original order of elements in the array:
   [0] : 7
   [1] : 6
   [2] : 3
   [3] : 5
   [4] : 5
   [5] : 9
   [6] : 1
   [7] : 2
   [8] : 5
   [9] : 3
   [10] : 4
   [11] : 5
   [12] : 6

After sorting the entire array by using the default comparer:
   [0] : 1
   [1] : 2
   [2] : 3
   [3] : 3
   [4] : 4
   [5] : 5
   [6] : 5
   [7] : 5
   [8] : 5
   [9] : 6
   [10] : 6
   [11] : 7
   [12] : 9

No segundo Ranqueamento aparece os número ordenados, mas preciso na verdade que sejam assumidos postos e não uma sequência numérica como a apresentada, então precisa ficar como segue abaixo:

   [0] : 1
   [1] : 2
   [2.5] : 3
   [2.5] : 3
   [4] : 4
   [6.5] : 5
   [6.5] : 5
   [6.5] : 5
   [6.5] : 5
   [9.5] : 6
   [9.5] : 6
   [11] : 7
   [12] : 9

Ou seja os valores iguais tem seus postos somados e extraídos a média, para que depois essa média seja a classificação, como acontece com o número 5 e 6, ou seja, o posto de 5 é na verdade a média entre a soma dos postos 5,6,7,8 (4+5+6+7+8)/4 = 6.5 e o primeiro número 6 mantêm a o ranking normal (9), mas por estar repetido, precisa ter a média dos postos calculada (9+10)/2 = 9.5.
espero ter explicado. Detalhe a Array muda em função dos dados que irá alimentá-la, o código acima é apenas um exemplo.
Ufa, muita coisa


AntSoft Systems On Demand



Resposta escolhida #482007 - 29/05/2018 20:27:09

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Então o que você quer se resolve com um tupple ou uma classe que represente cada ítem, ou ainda, uma propriedade que contenha todos os dados de média e agrupamento que você quer. Não é uma simples ordenação.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#482018 - 30/05/2018 10:10:14

WCOSTA
VASSOURAS
Cadast. em:Dezembro/2003


Membro da equipe
Citação:
:
Então o que você quer se resolve com um tupple ou uma classe que represente cada ítem, ou ainda, uma propriedade que contenha todos os dados de média e agrupamento que você quer. Não é uma simples ordenação.

Grande Oráculo, Tentei elaborar algumas rotinas e classe, mas inclinei em usar a Biblioteca MathNet, que já traz essa possibilidade através da função Statistics.Ranks(data, RankDefinition.Average) e com o mínimo de esforço possível. Mais uma vez obrigado e ponto para você.

AntSoft Systems On Demand



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por WCOSTA em 30/05/2018 10:10:32