2

この宿題があります。そして、私は初心者の C# プログラムで、現在 C# と Java を学んでいます

宿題: Drink[] 配列を取得する静的メソッドを作成します。ここで、AlcoholDrink は異なるアルコール値を持っています。このメソッドは、アルコールの最高値 3 つを含む配列を返します。配列内のアルコール飲料がそれほど多くない場合、メソッドは null 参照を返しています!

このメソッドを書いてみましたが、正しく動作しません...

sz[1] = (AlcoholDrink)t[1];での原因 それは飲み物のオブジェクト (ノンアルコール) です。なぜそこにあるのかわかりません...

または、Compare メソッドが完全ではないか、間違いがある可能性があります...どのように目指すことができますか?

ここに私の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();
4

3 に答える 3

2

問題はここにあります:

        // 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 つでも 1 が返されます。これを行う:

else if (x is AlcoholicDrink) return -1;
else if (y is AlcoholicDrink) return 1;
else return 0;
于 2011-11-05T20:51:18.657 に答える
0

sort関数が、通常のDrinkとAlcoholDrinkを使用してcompareメソッドを呼び出すとします。1を返します。これは、Drink>AlcoholDrinkであるためです。ただし、CompareメソッドがAlcoholDrinkと通常のDrinkで呼び出された場合も、1が返されます。これは、AlcoholDrinkがDrinkより大きくないためです。

4つの別々のケース(AlcoholDrink、AlcoholDrink)を明示的に処理する必要があります。(AlcoholDrink、Drink); (Drink、AlcoholDrink)および(Drink、Drink)し、それぞれに適切な値を返します。

于 2011-11-05T20:48:41.127 に答える
0

配列の最後までノンアルコール飲料が本当に必要ですか? 代わりにそれらを除外できますか?

t.OfType<AlcoholDrink>()LINQ が可能であれば、フィルタリングを行うために使用できます。それ以外の場合は、独自のメソッドを実装できます。

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[];
}
于 2011-11-05T21:00:13.077 に答える