当前位置: 首页 > 知识库问答 >
问题:

Java:当用户给出的名字按字母顺序排列时,只打印第一个和最后一个

宁弘亮
2023-03-14
import java.util.Scanner;
import java.util.Arrays;
import java.util.*; 
import java.util.TreeSet; 

public class personSorter 
{
  public static void main(String[] args)
  {
  int count = 0; 
  Scanner in = new Scanner(System.in);

  boolean more = true;
  Person first = null;
  Person last = null; 

  Person[] people= new Person[10]; //my array 

  while(more)
  {
  System.out.println("Please enter the person's name or a blank line to quit");
  String names = in.nextLine(); 

  if (names.equals(""))
     {    
     more = false;
     }
 else
 {
        Person p1 = new Person(names);  //creating 10 person objects to be used
        Person p2 = new Person(names);
        Person p3 = new Person(names);
        Person p4 = new Person(names);
        Person p5 = new Person(names);
        Person p6 = new Person(names);
        Person p7 = new Person(names);
        Person p8 = new Person(names);
        Person p9 = new Person(names);
        Person p10 = new Person(names); 

       people[count] = p1; // using my person objects and declaring the index of variable count
       people[count] = p2;
       people[count] = p3;
       people[count] = p4;
       people[count] = p5;
       people[count] = p6;
       people[count] = p7;
       people[count] = p8;
       people[count] = p9;
       people[count] = p10;

        first = people[count];
        last  = people[count];

    TreeSet<String> treeSet = new TreeSet<String>(); //using TreeSort to get the names entered by user in ascending order

     treeSet.add(names);
     treeSet.add(names);
     treeSet.add(names);
     treeSet.add(names);
     treeSet.add(names);
     treeSet.add(names);
     treeSet.add(names);
     treeSet.add(names);
     treeSet.add(names);
     treeSet.add(names);



   first.compareTo(p1); //after TreeSort first compare method called of first object as it is now the first name in alphabet order
   last.compareTo(p10); //after TreeSort last compare method called of last object as it is now the last name in alphabet order

  count++;       
  }
}

//printing out the first and last name(in alphabet order) of the entered names 
  System.out.println("First: " + first.toString()); 
  System.out.println("Last: " + last.toString());
 } 
 }
public class Person implements Comparable <Person> 
    {
        private String name;

public Person(String n) 
{
    name = n;
}

public String getName() 
{
    return name;
}

   @Override
public int compareTo(Person others) 
{
    if (name.compareTo(others.name) == 1) 
    {
        return 0;
    } 
    else if (name.compareTo(others.name) < 0) 
    {
        return -1;
    } 
    else 
    {
        return 1;
    }
   }
   public String toString() 
   {
   return "[" + name + "]";
   }

}

共有1个答案

林炫明
2023-03-14

下面是您的代码的简化和正确工作的版本(如果我很好地理解主方法的目标的话):

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

    boolean more = true;
    int MAX_SIZE = 10;

    Person[] people = new Person[MAX_SIZE]; // my array

    while (more && count < MAX_SIZE) {
        System.out.println("Please enter the person's name or a blank line to quit");
        String name = in.nextLine();

        if (name.equals("")) {
            more = false;
        } else {
            Person p = new Person(name); 
            people[count++] = p;
        }
    }
    in.close();

    Arrays.sort(people, 0, count);

    // printing out the first and last name(in alphabet order) of the entered names
    System.out.println("First: " + people[0]);
    System.out.println("Last: " + people[count - 1]);
}

几点考虑:

  • 不需要TreeSort对数组进行排序,只需使用arrays.sort方法即可。还要注意它作为输入的其他参数,以将其限制为开始和结束,这些参数不一定与数组的完整初始大小匹配(因为您是从控制台输入填充数组的)
  • 要填充数组的不同元素,需要移动到它的下一个索引,因此每次迭代时count变量都需要增加一个
  • 数组排序后,第一个和最后一个元素不需要临时变量,只需使用第一个索引(0)和最后一个填充(count-1)
  • 还需要将整个循环限制为数组的最大大小,以避免其大小变大并出现异常

希望您能更好地理解循环、数组、排序以及如何改进代码。

public static void main(String[] args) {
    int count = 0;
    Scanner in = new Scanner(System.in);
    int MAX_SIZE = 10;
    Person[] people = new Person[MAX_SIZE];

    System.out.println("Please enter the person's name or a blank line to quit");
    String line = in.nextLine();

    String[] names = line.split(" ");
    for (int i = 0; i < MAX_SIZE; i++) {
        Person p = new Person(names[i]);
        people[count++] = p;
    }
    in.close();

    Arrays.sort(people, 0, count);

    // printing out the first and last name(in alphabet order) of the entered names
    System.out.println("First: " + people[0]);
    System.out.println("Last: " + people[count - 1]);
}
 类似资料:
  • 问题内容: 我是Java的新手,正在尝试按字母顺序排列术语的arrayList。(一个术语定义为一个字符和一个整数)(例如 我的代码如下: 为什么这不起作用?以及我该如何完成呢?我的arrayList称为术语,填充有Term类型 问题答案: 您在这行代码中遇到的问题。您的课程不是So 的类型,这两个对象将基于哪个属性或条件方法? 您必须使您的类为Comparable类型。和,根据您的需要覆盖该方法

  • 问题内容: 通常情况下,排序与分类顶端的符号,像做或或。这是mysql排序的默认方式。数字和符号,然后是AZ。但是,这会使最丑陋或格式最糟糕的结果浮到顶部(例如or 或or 的结果)。 因此,我想做一个修改后的形式,首先是字母AZ,然后是特殊字符。 我将如何创建这种类型的排序?东西的条款? 问题答案: 基于此页面的google缓存链接: http : //www.google.com/url? s

  • 这个程序所做的就是打印出用户输入的单词的第二个到最后一个字符。我对它为什么要这样做感到困惑,并想知道如何将整个单词倒着打印出来。谁来帮忙。

  • 基于当前的实现,我将从某个来源获得一个数组列表,其中包含大约1000个按字母排序的唯一名称(A-Z或Z-A)。 我需要找到以给定字母表开头的第一个单词的索引。 因此,更准确地说,当我选择一个字母表,例如“M”时,它应该给我排序列表中以“M”开头的单词第一次出现的索引。 这样我就可以找到26个字母中每个字母开头的所有单词的索引。 请帮我找到一个不影响速度的解决方案。 更新时间: 实际上,在获得100

  • 问题内容: 我知道 将列出表中的所有列,但我有兴趣按字母顺序列出这些列。 说,我有三列,“姓名”,“年龄”和“性别”。 我希望这些列以以下格式组织 是否可以使用SQL做到这一点? 问题答案: 是的,没有:-) SQL本身并不关心列的排列顺序,但是,如果要使用的话: 您会发现它们可能按此顺序出现(尽管我不确定SQL标准是否要求这样做)。 现在您可能 不想 这样做,但有时生活不公平:-) 您还可以使用