2015-11-27 14 views
0

Я немного потерял, где я пошло не так вот мой главный файл:Java: Печать только первый и последний, когда имена, которые пользователь дал в алфавитном порядке

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()); 
} 
} 

Я использовал TreeSet организовать имена в алфавитном порядке. Затем я использовал вызов метода compareTo для объектов 1 и 10 только потому, что, когда они упорядочены в порядке алфавита, первым объектом становится первое имя, а последний объект становится фамилией.

Вот Person.java:

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 + "]"; 
    } 

} 

Однако окончательный вывод все имена, введенные пользователем в порядке, введенному его. Как и в, имена не были даже в алфавитном порядке. Любая помощь была бы очень оценена!

+0

Несколько вопросов: почему вы всегда создаете 10 объектов на основе вашего ввода? И почему вы никогда не увеличиваете счетную переменную при заполнении массива? Вы всегда назначаете новый объект Person одному элементу массива. –

+0

Извините, но ваш код полный беспорядок. Похоже, вам нужно узнать много чего, прежде чем беспокоиться о том, что порядок сортировки неверен. –

+1

Начните с этого: чтобы ваша программа напечатала введенные вами имена без какой-либо попытки поместить их в дерево. На данный момент даже это не работает. –

ответ

1

Вот упрощенная и работает правильно версию кода (если я хорошо понял цель этого основного метода):

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) и последний заселена (количество - 1)
  • Кроме того, необходимо ограничить весь цикл до максимального размера массива, чтобы не выпасть из его размера и получить исключение

Надеюсь, вы получите лучшее представление о циклах, массивах, сортировке и о том, как ваш код мог быть улучшен.

Обновление: Приведенный выше код будет читать имена один за другим после каждого ввода, до тех пор, пока не будет предоставлен пустой ввод или не будет достигнут предел MAX_SIZE. Если вы хотите набирать все имена одним выстрелом, вам даже не нужен цикл, ваш код будет еще более упрощен, но вы должны каким-то образом разделить маркеры (ваши имена), иначе все они будут восприниматься как один большой имя. Посмотрите на код ниже, который разделяет маркеры (имена) с помощью метода String.split() и использует «» (пробел) в качестве разделителя токенов.

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]); 
} 
+0

Благодарим вас за отзыв. Как вы можете сказать, я все еще новичок в java. Я вижу, что обновленный код не реализует метод compareTo. Итак, когда вы запускаете код, вы снова получаете весь массив, и он не сортируется. – Codes316

+0

Метод compareTo неявно вызывается методом Arrays.sort, который сортирует массив для нас. После этого вызова люди массива будут отлично отсортированы. Я проверил код, и первый и последний элементы, напечатанные на его конце, будут эффективно первым и последним в алфавитном порядке. Вы проверили этот код? –

+0

Да, я проверил код Serveral times- Это то, что я получаю: Пожалуйста, введите имя человека или пустую строку, чтобы бросить курить Дэвид Марк Дьюк Zues Брэндон Шон Рич Эрик Брэд Эллен Пожалуйста, введите имя человека или пустой line to quit Первый: Person @ 7dbc345a Last: Person @ 7dbc345a – Codes316

0

вы можете сделать то же самое с первым() и последний() методы в TreeSet.Read Java документацию для деталей. http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html

TreeSet сохраняет значения в отсортированном порядке, а первый и последний методы возвращают первое и последнее значения в наборе соответственно.

Сейчас подходит к коду:

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); 

Вы создаете 10 объектов с одинаковым значением инициализируется I.e, когда он петли для второго прохода, все объекты будут содержать это второе значение, а начальное значение будет потеряно. В этом случае ваши объекты будут содержать только последние введенные значения.

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]; 

И затем вы назначаете те же объекты одному и тому же элементу массива (один и тот же индекс) десять раз. После этого вы назначаете этот объект первой и последней переменной. Поэтому после того, как вся эта итерация первой и последней будет содержать введенный последний элемент пользователя. И метод compareTo возвращает целое число, которое нигде не фиксируется и сравнение бесполезно, если вы используете treeet (в данном случае).

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 

В целом либо вы пытаетесь сделать что-то еще, либо использовали неправильную логику. Вставьте имена в деревья и используйте первый и последний методы для получения имени.

 Смежные вопросы

  • Нет связанных вопросов^_^