-4

扑克等级为2345..9TJQKA

给定一个卡片数组 String s[] = {"Qh", "Jd", "2h"}。

我想回来

s[] = {"2h", "Jd", "Qh"}

这是我的代码:

         Arrays.sort(s, new Comparator<String>() {
        @Override
        public int compare (String s1, String s2) {
            int v1 = (int) s1.charAt(0);
            int v2 = (int) s2.charAt(0);
            if (v1 == 65) v1 = 100; //changes the value of A
            if (v2 == 65) v2 = 100;
            if (v1 == 75) v1 = 85; //changes the value of K
            if (v2 == 75) v2 = 85;
            if (v1 == 84) v1 = 60;
            if (v2 == 84) v2 = 60; //changes the value of T
            return v1 - v2;
        }
    }

它使数组保持不变。

4

4 回答 4

1

我使用以下代码测试了您的代码:

import java.util.*;

public class test {
   public static void main(String... args) {
      String s[] = {"Qh", "Jd", "2h"};
      Arrays.sort(s, new Comparator<String>() {
         @Override
         public int compare (String s1, String s2) {
            int v1 = (int) s1.charAt(0);
            int v2 = (int) s2.charAt(0);
            if (v1 == 65) v1 = 100; //changes the value of A
            if (v2 == 65) v2 = 100;
            if (v1 == 75) v1 = 85; //changes the value of K
            if (v2 == 75) v2 = 85;
            if (v1 == 84) v1 = 60;
            if (v2 == 84) v2 = 60; //changes the value of T
            return v1 - v2;
         }
      });
      for (String card : s) {
         System.out.println(card);
      }   
   }
}

它打印:

2h
Jd
Qh

它对我有用,所以问题可能出在您调用/使用排序例程的方式上

于 2013-01-16T02:23:05.323 回答
0

浏览 compareInstance.compare 上的javadocs

比较它的两个参数的顺序。返回负整数、零或正整数,因为第一个参数小于、等于或大于第二个。

因此,您返回的是 v1 和 v2 之间的差异,从表面上看,这很奇怪。

于 2013-01-16T01:58:20.337 回答
0

如果没有看到更多你的程序,很难确切地说出哪里出了问题,但是,你正在为你的compare. 通过重复if语句,而不是if/else,您可以在 v1 或 v2 上执行两个 if 语句。考虑使用switch.

另一个观察结果是,这种东西适合封装。为什么不使用 Card 类来隐藏每张卡片的值,而不是尝试在您的compare方法中“翻译”它?

于 2013-01-16T02:14:58.740 回答
0

您正在修改每只手的第一个字母的 ASCII 代码的临时副本,而不是修改真实的字符串。

并不是说我建议您按照您现在的方式进行操作,首先循环替换字符串,然后使用您的自定义逻辑对它们进行排序。这是 O(n*2)但它仍然非常快,你不是一次处理数百万手,是吗?

我很无聊,为你做这件事:

import java.util.*;
import java.lang.*;

class Main {
    public static void main(String[] args) throws java.lang.Exception {
        String s[] = {
            "Ad", "2h", "Qh" //I replaced it with an A so your replacement code can kick in
        }; //See http://www.asciitable.com/index/asciifull.gif
        String mod[] = new String[s.length];
        for(int i = 0; i < s.length; i++) {
            int v1 = s[i].charAt(0);
            int v2 = s[i].charAt(1);
            if (v1 == 65) v1 = 100; //changes the value of A
            if (v1 == 75) v1 = 85; //changes the value of K
            if (v1 == 84) v1 = 60;
            String a1 = (char)v1 + "";
            String a2 = (char)v2 + "";
            mod[i] = a1 + a2 + "";
        }
        Arrays.sort(mod, new Comparator < String > () {
            @Override
            public int compare(String s1, String s2) {
                int v1 = (int) s1.charAt(0);
                int v2 = (int) s2.charAt(0);
                return v1 - v2;
            }
        });
        for (int i = 0; i < mod.length; i++)
            System.out.println(mod[i]);
    }
}

糟糕,它肯定不是 O(n*2),因为文档引用的排序是 logn -ish,抱歉。

于 2013-01-16T02:16:25.683 回答