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

问题描述:

所以我想排序一副扑克牌。构造函数DeckOfCards设置并洗牌一副牌。但卡片存储在卡片类型属于卡片类别的类型列表中。在调用DeckOfCards之后,我应该询问用户应该使用什么样的排序算法对卡片进行排序。例如,我刚刚在最后包含了插入排序。但是insertionsort函数需要一个双数组。所以我需要将List列表转换为双数组。我该怎么做?如何将列表类型转换为双数组或int数组?

代码:

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; 
} 
} 
} 
+0

可能的重复[转换列表到数组在java中](http://stackoverflow.com/questions/9572795/convert-list-to-array-in-java) – Andrew 2013-02-10 23:39:10

+0

从什么神奇的地方'双[]'数组排序来自该代码? – 2013-02-10 23:39:28

+0

编写一个采用'List '并让你的卡实现Comparable。 – assylias 2013-02-10 23:49:14

如果你想转换Card对象,即List<Card> list你可以很容易地将其更改为Card阵列(即Card[])使用List本身提供的方法列表称为toArray

但是,您在询问什么时会有些困惑。你期望一个方法,期望一个double突然奇迹般地知道如何处理Card类型的对象。 Card如何突然表现为双精度数字?

你应该改变方法insertionSort()第一(你可能是从某个地方被复制,而试图了解其做)先来Card[]数组,然后修改什么的内部这样的比较发生在的性质Card对象而不是double原语。

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

如果我理解正确,你想用不同的算法对卡片进行排序。而你的算法实现只接受double数组。

两个问题,你需要考虑:

  • 卡比较的规则,例如Heart Ace>钻石王牌?

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

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

我建议你停止思考卡数组类型转换为双阵列。相反,使所有算法实现更通用,例如,接受Comparable[] arr数组,甚至Card[] arr。然后让你的Card类实现Comparable接口。在compareTo(Card c)方法中实施您的卡比较规则。

+0

所以你的意思是在算法函数体内,我应该通过一个卡[] ARR而不是双[] ARR? – 2013-02-11 00:08:44

+0

'Comparable []'会更好,因为它可以用于任何情况。当然,只有当你所有的排序都是**比较排序** – Kent 2013-02-11 00:10:19

+0

谢谢大家。我想到了。这里的每个人都帮助我完成了任务。再次感谢! – 2013-02-12 22:18:41