如何将列表类型转换为double数组或int数组?

时间:2013-02-10 23:37:16

标签: java arrays list

所以我想排序一副纸牌。构造函数DeckOfCards设置并洗牌一副牌。但是这些卡存储在List类型列表中,其中Card类型属于Card类。在调用DeckOfCards之后,我应该询问用户应该使用什么样的排序算法来对卡片组进行排序。我刚刚在最后包含了插入排序。但insertionsort函数采用双数组。所以我需要将List列表转换为double数组。我该怎么办?

代码:

import java.util.List;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;

// class to represent a Card in a deck of cards
class Card 
{    
public static enum Face { Ace, Deuce, Three, Four, Five, Six,
  Seven, Eight, Nine, Ten, Jack, Queen, King  };
public static enum Suit { Clubs, Diamonds, Hearts, Spades };

private final Face face; // face of card
private final Suit suit; // suit of card

// two-argument constructor
public Card( Face cardFace, Suit cardSuit ) 
{   
   face = cardFace; // initialize face of card
   suit = cardSuit; // initialize suit of card
} // end two-argument Card constructor

// return face of the card
public Face getFace() 
{ 
  return face; 
} // end method getFace

// return suit of Card
public Suit getSuit() 
{ 
  return suit; 
} // end method getSuit

// return String representation of Card
public String toString()
{
   return String.format( "%s of %s", face, suit );
} // end method toString
} // end class Card

// class DeckOfCards declaration
public class DeckOfCards 
{
private List<Card> list; // declare List that will store Cards

// set up deck of Cards and shuffle
public DeckOfCards()
{
  Card[] deck = new Card[ 52 ];
  int count = 0; // number of cards

  // populate deck with Card objects
  for ( Card.Suit suit : Card.Suit.values() )  
  {
     for ( Card.Face face : Card.Face.values() )   
     {
        deck[ count ] = new Card( face, suit );
        count++;
     } // end for
  } // end for

  list = Arrays.asList( deck ); // get List
  Collections.shuffle( list );  // shuffle deck
} // end DeckOfCards constructor

// output deck
public void printCards()
{
  // display 52 cards in two columns
  for ( int i = 0; i < list.size(); i++ )
     System.out.printf( "%-20s%s", list.get( i ),
        ( ( i + 1 ) % 2 == 0 ) ? "\n" : "" );
} // end method printCards

public static void main( String args[] )
{
  DeckOfCards cards = new DeckOfCards();
  cards.printCards();
  //add code here to take input from user and sort
  int a;
  System.out.println("\nSort the deck of cards");
  System.out.println("\nEnter your choice: \n1.Selection Sort \n2.Insertion Sort 
\n3.Merge       Sort\n");
  //take input
  Scanner reader = new Scanner(System.in);
  a=reader.nextInt();
  switch(a)
  {
    case 1:
        //call Selection sort
        break;
    case 2:
        //call Insertion sort
        break;
    case 3:
        //call Merge sort
        break;
  }
 } // end main  

//Insertion sort

} // end class DeckOfCards
public class InsertionSort {
/** The method for sorting the numbers */
public static void insertionSort(double[] list) {
for (int i = 1; i < list.length; i++) {
  /** insert list[i] into a sorted sublist list[0..i-1] so that
       list[0..i] is sorted. */
  double currentElement = list[i];
  int k;
  for (k = i - 1; k >= 0 && list[k] > currentElement; k--) {
    list[k + 1] = list[k];
  }

  // Insert the current element into list[k+1]
  list[k + 1] = currentElement;
}
}
}

2 个答案:

答案 0 :(得分:0)

如果您想转换Card个对象的列表,即List<Card> list,您可以使用以下方法轻松将其更改为Card数组(即Card[]List本身称为toArray

然而,你对自己的要求有些困惑。您期望一个期望数组double的方法突然神奇地知道如何处理Card类型的对象。 Card如何突然表现为双精度数?

您应首先更改方法insertionSort()(您可能从某处复制而不试图了解它的作用)先取Card[]数组,然后在内部修改它的内容,以便比较发生在Card对象的属性而不是double原语。

另一方面,您可能有兴趣知道Java已经通过Arrays类提供了排序功能。您可以查看函数Arrays.sort()。但是你仍然需要实现Comparable接口,以便Java知道如何对数组进行排序,它不知道你的Card对象应该如何排序(通过face?by??按顺序排序? Java不知道如何玩牌),所以你需要让你的Card对象实现Comparable并使用compareTo()方法帮助Java决定哪个Card实例来在此之前。如果您仍想自己实施排序并更改方法insertionSort()以获取Comparable项目数组,则可以使用相同的方法,在其中调用compareTo()以知道哪个项目来在什么之前。

答案 1 :(得分:0)

如果我理解正确,您希望使用不同的算法对卡片进行排序。并且您的算法实现仅接受double数组。

你需要考虑两个问题:

  • 卡片比较规则,例如Heart Ace&gt;钻石王牌?

  • 如果所有排序都是比较排序算法?

如果第二个问题的答案是:

我建议你不要再考虑将Card Array类型转换为double数组了。相反,使所有算法实现更通用,例如,接受Comparable[] arr数组,甚至Card[] arr。然后让你的Card类实现Comparable接口。在compareTo(Card c)方法中实施您的卡片比较规则。