如何将列表类型转换为双数组或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;
}
}
}
如果你想转换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)
方法中实施您的卡比较规则。
所以你的意思是在算法函数体内,我应该通过一个卡[] ARR而不是双[] ARR? – 2013-02-11 00:08:44
'Comparable []'会更好,因为它可以用于任何情况。当然,只有当你所有的排序都是**比较排序** – Kent 2013-02-11 00:10:19
谢谢大家。我想到了。这里的每个人都帮助我完成了任务。再次感谢! – 2013-02-12 22:18:41
可能的重复[转换列表到数组在java中](http://stackoverflow.com/questions/9572795/convert-list-to-array-in-java) – Andrew 2013-02-10 23:39:10
从什么神奇的地方'双[]'数组排序来自该代码? – 2013-02-10 23:39:28
编写一个采用'List '并让你的卡实现Comparable。 – assylias 2013-02-10 23:49:14