虽然(真)循环不会中断,但会永远运行 import java.util.*; 导入java.awt.*; 公共类Lab11bst { 公共静态void main(字符串参数[]) { System.out.println(“选择一张卡,任何一张卡”); System.out.println(); 甲板=新甲板(); 系统输出打印LN(甲板); } } 班级卡 { 私服; 私有字符串秩; 私有int点值; 公共卡(字符串s、字符串r、整数pV) { 西服=s; 秩=r; 点值=pV; } 公共字符串({ 返回诉讼;} 公共字符串秩(){ 返回秩;} 公共int pointValue(){ 返回点值;} 公共布尔匹配(卡或其他卡) { 返回otherCard.suit().equals(this.suit()) &&otherCard.rank().equals(this.rank()) &&otherCard.pointValue()==此.pointValue(); } 公共字符串toString() { 返回“+suit+”(Point Value=“+pointValue+”)中的“+rank+”; } } 甲板 { 私人卡[]卡; 私有整数大小; 私人卡[]新卡; 私人字符串[]套装={“俱乐部”、“钻石”、“红心”、“黑桃”}; 私人字符串[]排名={“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”、“十”、“杰克”、“女王”、“国王”、“王牌”}; 私有int[]点值={2,3,4,5,6,7,8,9,10,10,10,11}; 公共甲板() { 尺寸=52; 卡片=新卡片[尺寸]; int指数=0; 对于(int s=0;s

虽然(真)循环不会中断,但会永远运行 import java.util.*; 导入java.awt.*; 公共类Lab11bst { 公共静态void main(字符串参数[]) { System.out.println(“选择一张卡,任何一张卡”); System.out.println(); 甲板=新甲板(); 系统输出打印LN(甲板); } } 班级卡 { 私服; 私有字符串秩; 私有int点值; 公共卡(字符串s、字符串r、整数pV) { 西服=s; 秩=r; 点值=pV; } 公共字符串({ 返回诉讼;} 公共字符串秩(){ 返回秩;} 公共int pointValue(){ 返回点值;} 公共布尔匹配(卡或其他卡) { 返回otherCard.suit().equals(this.suit()) &&otherCard.rank().equals(this.rank()) &&otherCard.pointValue()==此.pointValue(); } 公共字符串toString() { 返回“+suit+”(Point Value=“+pointValue+”)中的“+rank+”; } } 甲板 { 私人卡[]卡; 私有整数大小; 私人卡[]新卡; 私人字符串[]套装={“俱乐部”、“钻石”、“红心”、“黑桃”}; 私人字符串[]排名={“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”、“十”、“杰克”、“女王”、“国王”、“王牌”}; 私有int[]点值={2,3,4,5,6,7,8,9,10,10,10,11}; 公共甲板() { 尺寸=52; 卡片=新卡片[尺寸]; int指数=0; 对于(int s=0;s,java,Java,,您的问题是每次都要检查整个数组,而不仅仅是填充的部分 数组最初是52个单元格,包含0 for (int k = 0; k < size; k++) { while(true) { spot = (int)( Math.random() *52 ); if (repeat(prevSpots, spot) == false) {

,您的问题是每次都要检查整个数组,而不仅仅是填充的部分

数组最初是52个单元格,包含0

for (int k = 0; k < size; k++)
         {
            while(true)
            {
            spot = (int)( Math.random() *52 );
            if (repeat(prevSpots, spot) == false)
               {
              break;
               }
            }
            newcards[k]  = cards[spot];
            prevSpots[k] = spot;
         }
你选择一个数字,比如6。它检查了所有52个单元格,发现其中没有一个包含6。这很好,所以它把6放在第一个位置

┌───┬───┬───┬───┬─────┬───┐
│ 0 │ 0 │ 0 │ 0 │ ... │ 0 │
└───┴───┴───┴───┴─────┴───┘
你选择另一个数字,比如19。它检查所有52个单元格。它的值是6和0。好的,19是好的,它把它放在下一个单元格中

┌───┬───┬───┬───┬─────┬───┐
│ 6 │ 0 │ 0 │ 0 │ ... │ 0 │
└───┴───┴───┴───┴─────┴───┘
以此类推。问题是,除了0之外,你将选择所有数字。每次它选择0时,它都会检查它,并且数组中已经有一个0。一旦你填写了所有其他数字(1-51),你就不能选择除0以外的任何其他数字。但是你已经有了0,因为你检查了整个数组

您必须检查“repeat”(重复)的次数,但不包括-
k

顺便说一句,这是一种非常糟糕的数组洗牌方法。根据随机数生成器的不同,其时间复杂度可能接近无穷大。最有效的洗牌算法是:

  • 在阵列中按从0到51的自然顺序填充卡
  • 对于从51到0的降序排列的
    num
    • 选择一个介于0和
      num(含)之间的随机数
      rand
    • array[rand]
      array[num]

当你完成时,你的数组会被洗牌-因为在每一回合中,你都会随机选取一个尚未选取的单元格。因为如果选取了,它已经被换成了另一个未选取的数字。

你的问题是,你每次都会检查整个数组,而不仅仅是你填充的部分

数组最初是52个单元格,包含0

for (int k = 0; k < size; k++)
         {
            while(true)
            {
            spot = (int)( Math.random() *52 );
            if (repeat(prevSpots, spot) == false)
               {
              break;
               }
            }
            newcards[k]  = cards[spot];
            prevSpots[k] = spot;
         }
你选择一个数字,比如6。它检查了所有52个单元格,发现其中没有一个包含6。这很好,所以它把6放在第一个位置

┌───┬───┬───┬───┬─────┬───┐
│ 0 │ 0 │ 0 │ 0 │ ... │ 0 │
└───┴───┴───┴───┴─────┴───┘
你选择另一个数字,比如19。它检查所有52个单元格。它的值是6和0。好的,19是好的,它把它放在下一个单元格中

┌───┬───┬───┬───┬─────┬───┐
│ 6 │ 0 │ 0 │ 0 │ ... │ 0 │
└───┴───┴───┴───┴─────┴───┘
以此类推。问题是,除了0之外,你将选择所有数字。每次它选择0时,它都会检查它,并且数组中已经有一个0。一旦你填写了所有其他数字(1-51),你就不能选择除0以外的任何其他数字。但是你已经有了0,因为你检查了整个数组

您必须检查“repeat”(重复)的次数,但不包括-
k

顺便说一句,这是一种非常糟糕的数组洗牌方法。根据随机数生成器的不同,其时间复杂度可能接近无穷大。最有效的洗牌算法是:

  • 在阵列中按从0到51的自然顺序填充卡
  • 对于从51到0的降序排列的
    num
    • 选择一个介于0和
      num(含)之间的随机数
      rand
    • array[rand]
      array[num]
当你完成时,你的数组会被洗牌-因为在每一回合中,你都会随机选取一个尚未选取的单元格。因为如果选取了该单元格,它已经被交换为另一个未选取的数字。

repeat()
始终检查整个数组,数组的开头包含52个零。这样,零本身就永远不能放在数组中

它应该得到
k

┌───┬────┬───┬───┬─────┬───┐
│ 6 │ 19 │ 0 │ 0 │ ... │ 0 │
└───┴────┴───┴───┴─────┴───┘
repeat()
始终检查整个数组,该数组在开头包含52个零。这样,零本身就永远不能放在数组中

它应该得到
k

┌───┬────┬───┬───┬─────┬───┐
│ 6 │ 19 │ 0 │ 0 │ ... │ 0 │
└───┴────┴───┴───┴─────┴───┘

size
似乎不知从何而来,
newcards
没有类型,…-这甚至可以编译吗?请在整个程序中稍等,尝试更新问题中的代码,使其成为一个,这将使人们更容易帮助您。
repeat
方法在匹配时返回true,但您的逻辑不正确他
while
循环测试终止循环的错误指示。当它们应该相同时,这些测试似乎相反。仅供参考:洗牌牌(或任何东西)有完善的算法,
size
似乎不知从何而来,
newcards
没有类型。。。