Java在数组中比较字符串

Java在数组中比较字符串,java,arrays,string,sorting,Java,Arrays,String,Sorting,给定一个字符串数组,返回数字最多、紧跟字母x的字符串。如果两个字符串的编号相同,则返回索引最低的字符串 gooD({"1x","123456789","1y3534ssf","4hsd73s"}) → "1x" gooD({"1xs3x3412fgxx6","1x+4x=5x","x5x"}) → "1x+4x=5x" gooD({"3x2y11x3gx5x","","232","2x2xx3x3x"}) → "2x2xx3x3x" 我完全不明白为什么我的代码不起作用。为什么会这样 publi

给定一个字符串数组,返回数字最多、紧跟字母x的字符串。如果两个字符串的编号相同,则返回索引最低的字符串

gooD({"1x","123456789","1y3534ssf","4hsd73s"}) → "1x"
gooD({"1xs3x3412fgxx6","1x+4x=5x","x5x"}) → "1x+4x=5x"
gooD({"3x2y11x3gx5x","","232","2x2xx3x3x"}) → "2x2xx3x3x"
我完全不明白为什么我的代码不起作用。为什么会这样

public String gooD(String arr[]) {
    String digits="0123456789";
    int low=0;
    int check=0;
    String s="";
    String d="";
    for (int i=0; i<arr.length; i++) {
        s=arr[i];
        for (int j=0; j<s.length()-1; j++) {
            if (digits.indexOf(s.substring(j,j+1))!=-1) {
                    if (s.substring(j+1,j+2).equals("x")) {
                        d+=s.substring(j,j+1);
                    }
            }
        }
        check=d.length();
        if (check<low) low=check;
        d="";
    }
    for (int i=0; i<arr.length; i++) {
        s=arr[i];
        for (int j=0; j<s.length()-1; j++) {
            if (digits.indexOf(s.substring(j,j+1))!=-1) {
                    if (s.substring(j+1,j+2).equals("x")) {
                        d+=s.substring(j,j+1);
                    }
            }
        }
        if (d.length()==low) return d;
        d="";
    }
    return d;
}
公共字符串良好(字符串arr[]{
字符串数字=“0123456789”;
int低=0;
整数检查=0;
字符串s=“”;
字符串d=“”;
对于(int i=0;i一个错误是

if (check<low) low=check;
因为你正在寻找一个最大值

相当简单的是:

public static String gooD(String... arr) {
    int max = 0;
    String best = "";
    for( String s: arr ){
        String t = s.replaceAll( "\\dx", "" );
        int d = s.length() - t.length();
        if( d > max ){
            max = d;
            best = s;
        }
    }
    return best;
}

不管怎么说,这会更有效率

public String gooD(String arr[]) {
    Pattern pattern = Pattern.compile("\\dx");

    String candidate = "";
    int max = 0;
    for (String s : arr){
        Matcher matcher = pattern.matcher(s);
        int current = 0;
        while (matcher.find()){
            current++;
        }
        if (current > max){
            max = current;
            candidate = s;
        }
    }
    return candidate;
}

首先,您必须逆转您的测试:

    if (check<low) low=check;
您的代码正在寻找最小值而不是最大值

接下来,您将不返回输入数组,而只返回直接后跟
x
的数字

保留您的方法,一个可能的实现可能是:

public String gooD(String arr[]) {
    String digits = "0123456789";
    int low = 0;
    int ilow = 0; // first string by default
    int check = 0;
    String s;
    String d = "";
    for (int i = 0; i < arr.length; i++) {
        s = arr[i];
        check = 0;
        for (int j = 0; j < s.length() - 1; j++) {
            if (digits.indexOf(s.substring(j, j + 1)) != -1) {
                if (s.substring(j + 1, j + 2).equals("x")) {
                    check += 1;
                }
            }
        }
        if (check > low) { // only is strictly longer
            low = check;
            ilow = i; // keep the index of first longer string
        }
    }
    return arr[ilow]; // return the string
}
公共字符串良好(字符串arr[]{
字符串数字=“0123456789”;
int低=0;
int ilow=0;//默认情况下第一个字符串
整数检查=0;
字符串s;
字符串d=“”;
对于(int i=0;i低){//only严格地更长
低=检查;
ilow=i;//保留第一个较长字符串的索引
}
}
返回arr[ilow];//返回字符串
}

我建议您使用一个regexp,例如
\d+(?=x)
。使用matcher.find在字符串上循环。@user902383您可能会详细说明不祥的提示。
    if (check>low) low=check;
public String gooD(String arr[]) {
    String digits = "0123456789";
    int low = 0;
    int ilow = 0; // first string by default
    int check = 0;
    String s;
    String d = "";
    for (int i = 0; i < arr.length; i++) {
        s = arr[i];
        check = 0;
        for (int j = 0; j < s.length() - 1; j++) {
            if (digits.indexOf(s.substring(j, j + 1)) != -1) {
                if (s.substring(j + 1, j + 2).equals("x")) {
                    check += 1;
                }
            }
        }
        if (check > low) { // only is strictly longer
            low = check;
            ilow = i; // keep the index of first longer string
        }
    }
    return arr[ilow]; // return the string
}