【问题标题】:Comparing 3 Objects比较 3 个对象
【发布时间】:2012-08-19 00:26:52
【问题描述】:

我正在用 C# 编写通用二叉树。

在我的应用程序的一部分中,我需要按距离排序。

从 A 到 C,从 B 到 C。

类似这样的:

if ((A->C) == (B->C))  
    return 0;
else if((A->C) < (B->C))
    return -1;
else
    return 1;

但问题是,我只能在 2 个对象之间进行比较……而且我需要某种比较器。

创建像“开始和结束之间的距离”这样的类是正确的解决方案吗?我认为它产生了太多垃圾。

有什么解决办法吗? 谢谢;-)

编辑:

public AvlNode<T> _left, _right;
public Stack<T> _obj;

(...)

public AvlNode<T> Insert(T obj, IComparer<T> iComparer)
    {
        if (iComparer.Compare(obj, _obj.Peek()) > 0)
        {
            _right = (_right != null) ? _right.Insert(obj, iComparer) : new AvlNode<T>(obj);
            return Balance();
        }
        else if (iComparer.Compare(obj, _obj.Peek()) < 0)
        {
            _left = (_left != null) ? _left.Insert(obj, iComparer) : new AvlNode<T>(obj);
            return Balance();
        }
        else
        {
            _obj.Push(obj);  // distance already exists but object may be different, that's why I use a stack...
            return this;
        }
    }

我没有可用的 IComparer...

编辑:

问题解决了,现在我有一个工作的 IComparer!

public class ObjectDistanceComparer : IComparer<EraObject>
{
    Vector3 _position;


    public ObjectDistanceComparer(Vector3 position)
    {
        _position = position;
    }

    int IComparer<EraObject>.Compare(EraObject obj1, EraObject obj2)
    {
        float d1 = (_position - obj1._position).LengthSquared();
        float d2 = (_position - obj2._position).LengthSquared();
        return (d1 == d2)? 0 : (d1 < d2)? -1 : 1;
    }
}

谢谢 ;-)

【问题讨论】:

  • 你可以在一个类中实现一个通用方法来一次比较三个东西,我想,但我认为按顺序进行比较可能会更好。您将 A 与 B 进行比较,然后将 B 与 C 进行比较,您就会知道确切的顺序,对吗? (假设以一种理智的方式为实现类定义了比较,即它是可传递的。我认为这是一个公平的假设,可以提升您班级的用户。)
  • 您能否展示一些您对树的代码以及您打算如何从三个对象中“排序”它。目前还不清楚这应该如何工作。显示示例树及其“排序”形式。
  • 这与您的问题无关,但恕我直言,最好不要在成员变量的定义中使用_。尤其是公开的。
  • @Saeed Amiri,我是用java学的,怎么正确定义成员变量?谢谢;-)

标签: c# comparison comparator icomparable icomparer


【解决方案1】:

您可以在 Node 类中添加额外的属性:

public class Node : IComparable
{
   Node Parent{get;set;}
   Node LChild {get;set;}
   Node RChild {get;set;}
   Node C {get;set;}

   public int CompareTo(object o)
   {
      // Now you passed C in your object, do stuff ...
   }
}

【讨论】:

  • 这段代码在OP之前写的显示代码,所以它们不一样,但是非常相似的方式适用。
【解决方案2】:
public class Distance
{
int Source {get;set;}
int Destination{get;set;}
int Value{ 
          get{ return Math.Abs(Destination - Source);}
         }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-26
    • 2012-02-15
    • 2015-08-29
    相关资源
    最近更新 更多