简体   繁体   English

Java:三个字符串,按字典顺序

[英]Java: Three strings, lexicographic order

beginner Java programmer here. Java初学者在这里。 I am trying to compare three strings to each other, and have the system spit out the second/middle word in lexicographic order. 我正在尝试将三个字符串相互比较,并让系统按字典顺序吐出第二个/中间的单词。

import java.util.*;

public class Ordered2
{
public static void main(String[] args)
{
    String firstString, secondString, thirdString;

    Scanner keyboard = new Scanner(System.in);

    System.out.println("Enter three different strings.");
    System.out.println("The string in the middle order lexicographically will be displayed.");
    firstString = keyboard.nextLine();
    secondString = keyboard.nextLine();
    thirdString = keyboard.nextLine();

    String topString, middleString, bottomString;

    if (firstString.compareTo(secondString) > 0 && (firstString.compareTo(thirdString) > 0)) 
    { topString = firstString; }
    else if (firstString.compareTo(secondString) < 0 && (firstString.compareTo(thirdString) > 0)) {
    middleString = firstString; }
    else { bottomString = firstString; }

    if (secondString.compareTo(firstString) > 0 && (secondString.compareTo(thirdString) > 0)) {
    topString = secondString; }
    else if (secondString.compareTo(firstString) < 0 && (secondString.compareTo(thirdString) > 0)) {
    middleString = secondString; }
    else { bottomString = secondString; }

    if (thirdString.compareTo(secondString) > 0 && (thirdString.compareTo(firstString) > 0)) {
    topString = thirdString; }
    else if (thirdString.compareTo(secondString) < 0 && (thirdString.compareTo(firstString) > 0)) {
    middleString = thirdString; }
    else { bottomString = thirdString; }

    System.out.println("The second string in lexicographic order: " + middleString);
    }
}

This does not compile, and tells me that middleString has not been initialized. 这不会编译,并告诉我middleString尚未初始化。 Any help would be appreciated. 任何帮助,将不胜感激。

The Java compiler does not know which branch of an if statement will be executed. Java编译器不知道将执行if语句的哪个分支。 That means that if you initialize a variable in one branch but not the other, the variable is not guaranteed to have a value assigned to it. 这意味着,如果您在一个分支中初始化了一个变量,但未在另一个分支中初始化,则不保证该变量会分配值。 In your code, all of the variables will of course be initialized, but the compiler has no way of knowing this, hence your error. 在您的代码中,所有变量当然都将被初始化,但是编译器无法知道这一点,因此会出现错误。 You can just initialize the three to null or an empty string. 您可以将三个初始化为null或一个空字符串。 Replace String topString, middleString, bottomString; 替换String topString, middleString, bottomString; with

String topString = null;
String middleString = null;
String bottomString = null;

Additionally, you may want to use some of Java's built-in sorting functionality to do the sorting for you: 此外,您可能想使用Java的一些内置排序功能为您进行排序:

import java.util.*;

public class Ordered2
{
public static void main(String[] args)
{
    String firstString, secondString, thirdString;

    Scanner keyboard = new Scanner(System.in);

    System.out.println("Enter three different strings.");
    System.out.println("The string in the middle order lexicographically will be displayed.");
    firstString = keyboard.nextLine();
    secondString = keyboard.nextLine();
    thirdString = keyboard.nextLine();

    String[] array = new String[] {firstString, secondString, thirdString};

    Arrays.sort(array);

    System.out.println("The second string in lexicographic order: " + array[1]);
}
}

Arrays.sort() sorts the strings for you. Arrays.sort()为您排序字符串。 Taking the second (index 1) string out of the sorted array gives you the middle string. 从排序后的数组中取出第二个(索引1)字符串,得到中间的字符串。 If you want to sort using case-insensitive ordering, you can use Arrays.sort(array, String.CASE_INSENSITIVE_ORDER) . 如果要使用不区分大小写的排序进行排序,则可以使用Arrays.sort(array, String.CASE_INSENSITIVE_ORDER)

You have not initialised the variable middleString and using it in the end of the pgrm as 您尚未初始化变量middleString并将其在pgrm的末尾用作

System.out.println("The second string in lexicographic order: " + middleString);

Simple initialise the variable as below and it will compile. 如下简单地初始化变量,它将进行编译。

String  middleString ="";

Just initialize your 3 string topString, middleString, bottomString to empty like this: 只需将3个字符串topString,middleString,bottomString初始化为空即可,如下所示:

String topString = "";
String middleString = "";
String bottomString = "";

Must compile. 必须编译。

The logic here is wrong (I've reformatted a bit): 这里的逻辑是错误的(我已经重新格式化了一点):

if (firstString.compareTo(secondString) > 0 && (firstString.compareTo(thirdString) > 0)) 
    { topString = firstString; }
else if (firstString.compareTo(secondString) < 0 && (firstString.compareTo(thirdString) > 0)) 
    { middleString = firstString; }
else 
    { bottomString = firstString; }

(I'm going along with your approach, which I think can be made to work with some tweaking.) I'm going to call the strings S1, S2, S3. (我会采用您的方法,我认为可以进行一些调整。)我将把字符串称为S1,S2,S3。 Assuming none of the strings are equal, there are four cases you need to consider. 假设所有字符串都不相等,则需要考虑四种情况。 I've listed those, along with what the above code is doing: 我列出了这些内容,以及上面的代码在做什么:

S1 > S2 and S1 > S3    S1 is the top string   
S1 > S2 and S1 < S3    S1 is the bottom string
S1 < S2 and S1 > S3    S1 is the middle string
S1 < S2 and S1 < S3    S1 is the bottom string

One of those is wrong. 其中之一是错误的。 See it? 看见?

(I haven't checked the other two if 's. You should do the same thing, looking at four cases for each one.) (我没有检查其他两个if s。您应该做同样的事情,每个检查四个案例。)

If I understand your scenario, you are only interested in Strings, you can take advantage of the Natural Order of Strings and use JDK classes to help you out: 如果我了解您的情况,那么您只对字符串感兴趣,则可以利用字符串的自然顺序并使用JDK类来帮助您:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class StringSorter {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.println("Enter the FIRST string:");
    String first = scanner.nextLine();
    System.out.println("Enter the SECOND string:");
    String second = scanner.nextLine();
    System.out.println("Enter the THIRD string:");
    String third = scanner.nextLine();

    List<String> strings = new ArrayList<String>();

    strings.add(first);
    strings.add(second);
    strings.add(third);

    System.out.println("Before sort:");
    for (String s : strings) {
      System.out.println(s);
    }

    Collections.sort(strings);

    System.out.println("After sort:");
    for (String s : strings) {
      System.out.println(s);
    }

    System.out.println("The Middle String is '" + strings.get(1) + "'");

    scanner.close();

  }

}

When I ran this in Eclipse (go ahead, paste it in and try it!) using John, JOHN and Kevin as the names, I got this result: 当我使用John,JOHN和Kevin作为名称在Eclipse中运行此代码(继续,将其粘贴并尝试!)时,得到以下结果:

Enter the FIRST string:
John
Enter the SECOND string:
JOHN
Enter the THIRD string:
Kevin
Before sort:
John
JOHN
Kevin
After sort:
JOHN
John
Kevin
The Middle String is 'John'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM