【问题标题】:Java Arrays StringsJava 数组字符串
【发布时间】:2025-12-05 00:45:01
【问题描述】:

我是 java 新手,我最近写了一个程序,对字符串数组进行排序 导入 java.util.Scanner;

 public class 

【问题讨论】:

  • 您可以简单地比较 substring(1, 4) 或两个字符串。你可以使用 Arrays.sort(),传递一个比较器,而不是实现你自己的排序算法。
  • 您不必关心与 charAt 索引进行比较,compareTo 方法在内部进行,这意味着在内部将在索引 1、2、.. 处比较两个字符串,直到字符串长度
  • 你试过什么?您还查看了哪些其他搜索?你想自己实现还是使用库?
  • @Vishrant 我更喜欢使用 CharAt。
  • @JB 我不知道什么是比较器

标签: java arrays string sorting


【解决方案1】:

您仍然可以为此使用Arrays.sort 方法,只需提供自己定制的Comparator

Arrays.sort(name,
    (String left, String right) ->
        left.substring(1).compareTo(right.substring(1))
);

如果您想自己实现,请注意,如果参数相等,比较器应该返回 0,如果左边较低,则返回负数,如果右边较低,则返回正数。因此,逐个字符的比较器将如下所示:

Arrays.sort(name,
    (String left, String right) -> {
        // starting from index 1 and going until reaching end of strings
        for (int i = 1; i < left.length() && i < right.length(); ++i) {
            int diff = left.charAt(i)-right.charAt(i);
            if (diff != 0)
                return diff;
        }
        // if strings are equal so far, return that the lower is the shorter one
        return left.length()-right.length();
    }
);

【讨论】:

  • 谢谢,但这看起来很复杂..我正在尝试了解如何使用 CharAt 之类的东西来解决这个问题..
  • @ZbynekVyskovsky-kvr000 使用 lambda 表达式请提及 java 版本 1.8 或更高版本
  • @KidKool ,你也可以关注这个答案*.com/questions/35402555/…
  • @KidKool,Java collections 框架使程序员可以访问预打包的数据结构以及操作它们的算法。 ref-tutorialspoint.com/java/java_collections.htm AND 你在哪里需要trim()
  • @KidKool :绝对不是。您可以编写自己的排序实现,但坦率地说,为什么要重新发明*。所以我建议现有的实现,它是核心 java 的一部分。但是,我相信将比较器主体移动到单独的方法并不是什么大问题。
【解决方案2】:

由于您已经实现了用户输入并显示了值,我不会考虑到这一点。

有两件事需要实现:

  1. 比较两个对象;
  2. 根据比较结果,在元素之前或之后插入其中一项。

这是两个独立的函数。

比较两个对象

看看Comparator&lt;T&gt; 接口。它使您可以实现对象比较的方式。 Comparator 接口的唯一方法是方法compare(String o1, String o2)。您只需确保:

  • 如果两个对象的顺序相同,则返回0。在下面的示例中,SaabJaguar 是相同的,因为我们试图仅按第二个字符排序,即 a两者兼得。
  • 如果o1“小于”o2,则返回-1。在我们的示例中,将 SaabOpel 进行比较将返回 -1,因为 ap“小”强>。
  • 如果o1 大于o2,则返回1。在我们的示例中,比较 SkodaJaguar 将返回 1,因为 Skoda 的第二个字符(k >) 比 Jaguar 的第二个字符(a)“更大”。

顺便说一句,在您的原始代码中,您使用了 String.compareTo() 方法,这与 Comparator&lt;String&gt;.compare(String, String) 方法几乎完全相同

class MyCustomComparator implements Comparator<String>() {

    @Override
    public int compare(String t, String t1) {
        // We assume that the strings are not null
        // We also assume that the length of the
        // strings is at least 2.
        if (t.charAt(1) < t1.charAt(1)) {
            return -1;
        }
        else if (t.charAt(1) > t1.charAt(1)) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

在正确的位置插入元素

一旦您定义了自己的比较器,您唯一需要做的就是将它传递给方法Arrays.sort(T[] a, Comparator&lt;? super T&gt; c),该方法接受带有字符串的数组作为第一个参数,并接受您自己定义的比较器作为第二个参数。

例子:

String[] array = new String[] {
    "Saab",
    "Opel",
    "Skoda",
    "Jaguar",
    "Chevrolet"
};
// Result when ordering by second char:
// Saab, Jaguar, Chevy, Skoda, Opel

// Sort the array
Arrays.sort(array, new MyCustomComparator());

如果你真的真的真的想避免Arrays.sort()方法,你可以重新发明*:

/** Returns a new string array with the elements sorted */
String[] sort(String[] strings, Comparator<String> c) {
    List<String> sortedArray = new ArrayList<String>();
    for (String str : strings) {
        int i;
        for (i = 0; i < sortedArray.size(); i++) {
            if (c.compare(str, sortedArray.get(i)) < 0) {
                sortedArray.add(i, str);
                break;
            }
        }
        if (i == sortedArray.size()) {
            sortedArray.add(strings[i]);
        }
    }
    return sortedArray.toArray(new String[0]);
}

或者,您可以使用您的原始代码进行以下修改:

void myCustomCompareTo(String s1, String s2) {
    if (s1.charAt(1) < s2.charAt(1)) {
        return -1;
    }
    else if (s1.charAt(1) > s2.charAt(2)) {
        return 1;
    }
    else { // They're equal
        return 0;
    }
}

String[] sortMe(String[] strs) {
    for (int i = 0; i < 5 - 1; i++) {
        for (int j = 0; j < 5 - 1 - i; j++) {
            if (strs[j].myCustomCompareTo(name[j + 1]) > 0) {
                // Swap the two values
                String temp = name[j];
                strs[j] = strs[j + 1];
                strs[j + 1] = temp;
            }
        }
    }
    return strs;
}

其他说明

  • 我发现您很难理解给定答案的代码。我建议你开始检查String 类。您将了解length()charAt(int) 方法。尤其是length()经常被使用;我建议你考虑到这一点。此外,学习Generics 也可能有所帮助。
  • 我认识的几乎每个程序员都在for 循环中使用变量i,而不是x。您也应该考虑这样做。
  • 您没有使用变量num
  • Zbynek Vyskovsky - kvr000 使用的箭头 (-&gt;) 是 lambda expressions 的一部分。 Lambda 表达式是syntactic sugar,它们使事情更容易表达(但不一定要阅读,尤其是对于 Java 领域的新手而言)。

    例如,

    Arrays.sort(name,
        (String left, String right) ->
            left.substring(1).compareTo(right.substring(1))
    );
    

    和这个完全一样:

    Arrays.sort(name, new Comparator() {
    
        @Override
        public int compare(String left, String right) {
            return left.substring(1).compareTo(right.substring(1));
        }
    );
    

    但其实这超出了this的范围。

【讨论】:

  • 我不明白..那个程序没有得到用户输入的字符串。该程序甚至在排序后显示字符串的排序列表吗?我很困惑..
  • 我必须使用arrays.sort还是有更基本的方法?我只是想尽我所能...感谢您的帮助..编辑后的帖子很棒。
  • 我编辑了我的代码,但是有没有办法使用 charAt 但不使用 arrays.sory 或 lambdas 来做到这一点?
  • @KidKool 这是可能的。我要更新我的答案。但是……为什么不应该使用Arrays.sort()
  • 我只是想看看我是否可以在不使用该库的情况下做到这一点..对我来说似乎有点高级...我想以一种非常基本的方式分解它...跨度>