list.Group и транзитивность, рефлективность cmp
От: ecinunice  
Дата: 23.04.08 10:56
Оценка: 3 (1)
На основании анализа метода Group в list было установлено, что он правильно работает тогда и только тогда, когда функция cmp обладает свойством транзитивности и рефлективности для операции упорядочивания списка ( см. функцию sort).

Для самого метода Group это избыточно ( достаточно метода correct).

Вопрос – чем вызвано требование упорядочивания списка?

using System;
using System.Console;
using Nemerle;
using Nemerle.Utility;

[Record]
public class Point3D {
  [Accessor]
  x : int;
  [Accessor]
  y : int;
  [Accessor]
  z : int;
  public override ToString() : string{
      $"($(this.X),$(this.Y),$(this.Z))"
  }
}

module Program
{
  Main() : void
  {
    def l = [
        Point3D(1,1,1), 
        Point3D(1,2,2),
        Point3D(1,3,3),
        Point3D(2,1,4),
        Point3D(2,2,5),
        Point3D(2,3,6),
        Point3D(1,2,7)];

    // То, что работает сейчас
    def sort (a,b) {
        def l_cmp = a.X.CompareTo ( b.X );
        if ( l_cmp == 0 ) {
          a.Y.CompareTo ( b.Y )
        } else {
          l_cmp
        }
    }
        
    // То, чего достаточно    
    def correct(a,b) { 
      Math.Abs(a.X.CompareTo(b.X)) + Math.Abs(a.Y.CompareTo(b.Y)) 
    }

    WriteLine($"..$l");
    WriteLine(" sort:");
    WriteLine($"..$(l.Sort(sort))");    
    WriteLine($"..$(l.Group(sort))");    

    WriteLine(" correct:");
    WriteLine($"..$(l.Sort(correct))");    
    WriteLine($"..$(l.Group(correct))");    
    _ = ReadLine();
  }
}


Вывод:
(1,1,1), (1,2,2), (1,3,3), (2,1,4), (2,2,5), (2,3,6), (1,2,7)
 sort:
(1,1,1), (1,2,2), (1,2,7), (1,3,3), (2,1,4), (2,2,5), (2,3,6)
[(1,1,1)], [(1,2,7), (1,2,2)], [(1,3,3)], [(2,1,4)], [(2,2,5)], [(2,3,6)]
 correct:
(1,2,7), (2,3,6), (2,2,5), (2,1,4), (1,3,3), (1,2,2), (1,1,1)
[(1,2,7)], [(2,3,6)], [(2,2,5)], [(2,1,4)], [(1,3,3)], [(1,2,2)], [(1,1,1)]
... << RSDN@Home 1.2.0 alpha rev. 737>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.