【问题标题】:Compare() method, Parent and Children objects sorting not perfectCompare() 方法,父子对象排序不完美
【发布时间】:2011-11-05 20:39:13
【问题描述】:

我有这个作业。我是初学者C#程序,现在学习C#和Java

作业: 编写静态方法来获取 Drink[] 数组,其中 AlcoholDrink 具有不同的酒精值。该方法返回一个包含三个最高酒精值的数组!如果数组中没有那么多酒精饮料,则该方法返回一个空引用!

我试过写这个方法,但是不能正常工作...

因为在 sz[1] = (AlcoholDrink)t[1]; 它是一个 Drink 对象(非酒精),我不明白为什么它在那里......

也可能是我的 Compare 方法不完善,可能有错误...我该如何瞄准,非酒精饮料对象(Drink Objects)走到数组的末尾?

这是我的 C# 代码:

    class DrinkComparer : IComparer<Drink>
    {
        public int Compare(Drink x, Drink y)
        {
            // AlcoholDrink class is children of Drink class
            if (x is AlcoholDrink && y is AlcoholDrink)
            {
                AlcoholDrink a = (AlcoholDrink)x;
                AlcoholDrink b = (AlcoholDrink)y;
                double aAlk = a.GetValueOfAlcohol; 
                double bAlk = b.GetValueOfAlcohol;
                if (aAlk > bAlk)
                    return -1;
                else if (aAlk < bAlk)
                    return 1;
                else
                    return 0;
            }
            // Drink objects haven't got GetValueOfAlcohol method...
            // How can I aim, the non AlcoholDrink objects (Drink objects) go to the end     array?
            else
                return 1;                
        }
    }
    static AlcoholDrink[] Largest3AlcoholDrink(Drink[] t)
    {
        Array.Sort(t, new DrinkComparer());
        AlcoholDrink[] sz = new AlcoholDrink[3];
        sz[0] = (AlcoholDrink)t[0];
        sz[1] = (AlcoholDrink)t[1];
        sz[2] = (AlcoholDrink)t[2];
        return sz;
    }
        AlcoholDrink sz = new AlcoholDrink( "Kékfrankos" , "0.75 l", 1500, 4.5);
        Console.WriteLine(sz);

        Drink[] t = new Drink[8];
        t[0] = new AlcoholDrink("Kék Portói", "0.75 l", 1200, 20.5);
        t[1] = new Drink("Tocsik", "0.75 l", 1100); // Non Alcohol Drink
        t[2] = new AlcoholDrink("Tokaji Asszú", "0.75 l ", 1600, 14.5);
        t[3] = new AlcoholDrink("Egri Bikavér", "0.75 l", 1500, 23.5);
        t[4] = new Drink("Egri Szamóca", "0.75 l", 1100); // Non Alchol Drink
        t[5] = new AlcoholDrink("Egri Merlot", "0.75 l", 1700, 18.5);
        t[6] = new AlcoholDrink("Egri Medina", "0.75 l", 900, 16.5);
        t[7] = new AlcoholDrink("Törley Talisman", "0.75 l", 750, 4.5);
        Console.WriteLine(DrinkKeres( t, "Egri Bikavér"));

        Largest3AlcoholDrink(t);

        Console.ReadLine();

【问题讨论】:

  • 如果基类有 GetValueOfAlcohol 方法会简单得多,这样 nonalchhole 对象就会从这个方法中得到 0。
  • 是的,我知道,但是教授说,不能在基类中实现 GetValueOfAlcohol 方法或 valueOfAlcohol 字段
  • 如果Compare(Drink x, Drink y) 的参数只有一个是AlcoholDrink 呢?

标签: c# arrays compare icomparable


【解决方案1】:

问题就在这里:

        // Drink objects haven't got GetValueOfAlcohol method...
        // How can I aim, the non AlcoholDrink objects (Drink objects) go to the end     array?
        else
            return 1;

您希望非酒精饮料结束,但即使其中一种饮料是酒精的,这也会返回 1。这样做:

else if (x is AlcoholicDrink) return -1;
else if (y is AlcoholicDrink) return 1;
else return 0;

【讨论】:

  • 按照 OP 的排序方式(降序),您应该更改加减位置。
  • 是的,是的,这是最好的,这是最好的,非常感谢,但逻辑对我来说不清楚 else if 案例......简单的比较方法还可以,但是这个,为什么:D。也许我要睡觉了,明天我会明白的:)
  • 我的回答中解释了逻辑;它按照我的建议分别处理这四种情况。后一个“if”语句中的条件不必同时测试 x 和 y,因为您已经知道 (x is AlcoholDrink && y is AlcoholDrink) 是假的。
【解决方案2】:

假设 sort 函数使用普通 Drink 和 AlcoholDrink 调用您的比较方法。您返回 1,这很好,因为 Drink > AlcoholDrink。但是,如果使用 AlcoholDrink 和普通 Drink 调用 Compare 方法,您也会返回 1,这很糟糕,因为 AlcoholDrink 不大于 Drink。

您需要明确处理四种不同的情况(AlcoholDrink,AlcoholDrink); (酒精饮料,饮料); (Drink, AlcoholDrink) 和 (Drink, Drink) 并为每个返回适当的值。

【讨论】:

  • 是的,但是实施起来需要很长时间
【解决方案3】:

您真的需要非酒精饮料排到最后吗?你能把它们过滤掉吗?

如果您可以使用 LINQ,您可以使用 t.OfType&lt;AlcoholDrink&gt;() 进行过滤。否则,您可以实现自己的方法:

public AlcoholDrink[] GetAlcoholicDrinks(Drink[] drinks) {
  ArrayList alcoholDrinks = new ArrayList();
  foreach (Drink drink in drinks) {
    if (drink is AlcoholDrink) {
      alcoholDrinks.Add(drink);
    }
  }
  return alcoholDrinks.ToArray(typeof(AlcoholDrink)) as AlcoholDrink[];
}

【讨论】:

  • 这是一个家庭作业,重点是学习实现 IComparable。这可行,但超出了问题的范围。
  • 我不同意。 IComparable 仍然需要按酒精含量对饮料进行分类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多