【问题标题】:How to find the first letter (alphabetically) in a string?如何在字符串中找到第一个字母(按字母顺序)?
【发布时间】:2014-11-26 14:55:25
【问题描述】:

所以我需要弄清楚如何在字符串中找到字母表中第一个出现的字母。

到目前为止,我有这个:

import java.util.Scanner;


public class alphStr {

public static void main(String[] args) {
    System.out.println("Please enter a word - ");
    Scanner in = new Scanner(System.in);
    String word = in.nextLine();
    System.out.println("The word you entered was: " + word);
}

}

我想我可以使用 "> ||

经过一番阅读,终于有了这个解决方案,感谢大家的帮助。

    import java.util.Scanner;
    import java.util.Arrays;

    public class alphStr {

    public static void main(String[] args) {

    Scanner input = new Scanner (System.in);
    System.out.print("Enter a word: ");
    String word = input.next();
    char[] chars = word.toCharArray();
    Arrays.sort(chars);
    String sorted = new String(chars);
    char x = sorted.charAt(0);
    System.out.println("Alphabetically, the first letter in your word is: " + x);
}
}

【问题讨论】:

  • 对字符串内容进行排序并获得第一个字符?
  • 读取 String 类 javadoc。您将发现允许访问字符串字符的方法:docs.oracle.com/javase/7/docs/api/java/lang/String.html
  • Stack Overflow 已经变得有点蹩脚,很多脾气暴躁的人似乎喜欢这样,但我不得不问(这里还是别处?):这显然是功课。提交者基本上什么都没做。我也许可以花 5 分钟指出正确的方向,但是当很多人只是为了获得投票而将一些代码混合在一起时,真的有什么意义吗?我不认为它对任何人都有帮助,或者是吗?
  • 此外,在一个序列中找到最小的数可能不需要比 O(n) 更多的计算复杂度,你不觉得吗?

标签: java string sorting alphabetical


【解决方案1】:

我个人会使用 String 类的toCharArray() 方法。如

char[] word2 = word.toCharArray()

完成此操作后,将第一个字母存储在单独的 char 变量中,并按字典顺序将每个后续字母与其进行比较。通过这种方式,您可以找到字符串中第一个出现的字母(尽管您必须做更多的工作才能在大写和小写之间进行排序!)

【讨论】:

  • “按字典顺序比较每个后续字母” 我很确定这就是他想要弄清楚的部分
  • 我建议word.toLowerCase().toCharArray();
  • @Floegipoky 由于String 是不可变的,执行toLowerCase 将创建一个新的字符串(额外的对象),我真的认为大小写无关紧要,只要它是绝对字母(大写或更低)
  • @VinceEmigh 不幸的是,大小写确实很重要,因为除非先将其转换为相同的大小写,否则词法比较会产生不正确的结果。除非我误解了 OP 的要求。
  • @VinceEmigh 我知道这是他试图解决的部分,但我不会回答他显然是作业问题的全部。我只是想为他指明正确的方向!
【解决方案2】:

世界末日的答案会起作用,但我个人会遍历字母表,a-z,并改用String.indexOf(currentCharacter)。这样您就不必存储或比较任何内容,只需在 indexOf 第一次返回 -1 以外的任何内容时跳出循环。

【讨论】:

  • 这将是一个使用时间过多的算法。对于每个字母,有 26 种可能性。这意味着,对于 2 个字母的单词 zy,仅检查这 2 个字母就需要 51 次循环迭代。想象一下String 有 100 个字符长
  • 如果您认为字符串可能包含任何字符值,而不仅仅是 az(除非您准备好循环遍历 2^16 个字符值),它也根本不起作用。
  • @VinceEmigh 迄今为止提出的所有解决方案,包括我的,都是 O(n) 最坏的情况。计算机会非常乐意在 100 个字符的字符串上运行它。
  • @Floegipoky 您的解决方案不是 O(n)。它是 O(m * n),其中 m 是字母表的大小,n 是字符串的大小。
  • 您的算法显然有许多与字母表大小成正比的迭代次数,而经典算法并非如此。再次阅读文斯的信息。您的算法需要 51 次迭代才能找到 xz 的最大字母,而您在算法 101 课程的第一天学习的基本算法需要 2 次。
【解决方案3】:

您可以将单词中的字母转换为小写,然后将它们存储在一个数组中, 并应用simple sorting algorithm,即bubble sort 的略微修改版本,通过比较字符串中每个字符的ASCII 值来查找第一个字符。

char[] arr = word.toLowerCase().toCharArray();

// assume the smallest character is the character at index 0.
int first = 0;

// iterate through characters 1..n-1 to and check if any character is
// smaller than the one we have identified.
// if smaller, replace `first` with the index of the current character.
// at the end of the loop, `first` 
//will have the index of the smallest character.
for(int i = 1; i < arr.length; i++) {
    if(arr[i] < arr[first]) {
        first = i;
    }
}
System.out.println(word.charAt(first));

【讨论】:

  • 这正是我需要的,但我不太明白它是如何工作的。你能解释一下吗?如果不是,我将尝试再次阅读字符串类 javadoc。
  • @user3264285 char 可以表示为 int,反之亦然。例如,System.out.println((char) 74);
  • @user3264285检查我更新的答案。您需要了解如果两个字符的 ASCII 值相等,则它们是相等的。在java中比较两个字符,比较它们的ASCII值。
  • StringIndexOutOfBoundsException 为空String 会被抛出,你应该重新抛出它为IllegalArgumentException
【解决方案4】:

首先将字符串转换为大小写“Lower”或大写并使用 toCharArray() 并迭代此数组直到 string.length-1 并将第一个 char 索引存储在临时变量中并将 char 与 char 数组进行比较,如果找到小于此临时索引字符的字符,然后将此索引存储在字符中。

你可以在这里查看程序:Java program to find the first letter alphabetically in String

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2021-08-29
    • 2014-08-05
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多