2017-02-22 65 views
1

Я пытаюсь написать программу, которая сортирует имя по его фамилии, имя, когда применяется условие сортировки. Вход будет предоставлен из командной строки. Я начал этот путь, но понятия не имею, как заставить его работать.Как сортировать имя по фамилии из командной строки в java

Входной: сорт «джон главный» «класс грабить» «боб баран»

Выходной: класс, грабят главный, джон баран, боб

public static void main(String[] args) 
{ 
    String[] args_name = new String[args.length-1]; 
    System.arraycopy(args, 1, args_name, 0, args.length-1); 

    if(args[0].equals("sort")) 
    { 
     String firstName = name.substring(args_name,name.indexOf(" ")); 
     String lastName = name.substring(name.indexOf(" ")+1); 
     String slst = lastName + ", " + firstName; 

     Arrays.sort(slst); 

     for (String s: slst) System.out.print(s); 
    } 
} 
+1

Где ваш вход приходит? что такое 'args_name'? что такое 'имя'? Покажите весь код. Этот код не компилируется. – nhouser9

+0

вы дадите список имен от CMD? –

+0

Если вы читаете имена для сортировки из командной строки, как вы можете различать имена и фамилии? –

ответ

0

Попробуйте использовать компаратор для сортировки ввода. Для удобства мы удалили ваш args -связанный код. Вам все равно нужно будет повторно добавить его правильно.

Необходимые Imports

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Comparator; 
import java.util.List; 

Имя

class Name{ 
    public static final String FULL_NAME_DELIMITER = " "; 
    public static final String PRINT_DELIMITER = ", "; 

    private String firstName; 
    private String lastName; 

    public Name(String firstName, String lastName){ 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public static String[] getName(String fullName){ 
     return fullName.split(FULL_NAME_DELIMITER); 
    } 

    public String getLastName(){ 
     return this.lastName; 
    } 

    @Override 
    public String toString(){ 
     return String.join(PRINT_DELIMITER , this.lastName, this.firstName); 
    } 

    public void print(){ 
     System.out.println(this); 
    } 
} 

Компаратор

class NameComparator implements Comparator<Name>{ 
    @Override 
    public int compare(Name a, Name b) { 
     return a.getLastName().compareTo(b.getLastName()); // ASC: a to b or DESC: b to a 
    } 
} 

Использование

public class Main { 
    // Holds the sorted names 
    private static List<Name> names = new ArrayList<>(); 

    public static void main(String[] args) { 
     // The input names 
     String[] input = new String[]{ 
       "john main", 
       "rob class", 
       "bob ram" 
     }; 

     // Prepare list for sorting 
     String firstName; 
     String lastName; 
     String[] completeName; 

     for (String fullName : input) { 
      completeName = Name.getName(fullName); 
      firstName = completeName[0]; 
      lastName = completeName[1]; 
      names.add(new Name(firstName, lastName)); 
     } 

     // Actually sort 
     names.sort(new NameComparator()); 

     // Print 
     names.forEach(System.out::println); 
    } 
} 

EDIT

Чтобы использовать входные данные из командной строки, то арг параметр это то, что вы хотите использовать.

Использование с CommandLine Input

public class Main { 
    // Holds the sorted names 
    private static List<Name> names = new ArrayList<>(); 

    public static void main(String[] args) { 
     // The method (in case something else than "sort" is desired) 
     String method = args[0]; 

     // Check for valid method 
     if(!method.equals("sort")) return; 

     // The input names 
     String[] input = Arrays.copyOfRange(args, 1, args.length); 

     // Prepare list for sorting 
     String firstName; 
     String lastName; 
     String[] completeName; 

     for (String fullName : input) { 
      completeName = Name.getName(fullName); 
      firstName = completeName[0]; 
      lastName = completeName[1]; 
      names.add(new Name(firstName, lastName)); 
     } 

     // Actually sort 
     names.sort(new NameComparator()); 

     // Print 
     names.forEach(System.out::println); 
    } 
} 

EDIT 2

Чтобы использовать имя вместо фамилии, просто изменить компаратор.

class NameComparator implements Comparator<Name>{ 
    @Override 
    public int compare(Name a, Name b) { 
     return a.getFirstName().compareTo(b.getFirstName()); // ASC: a to b or DESC: b to a 
    } 
} 

Конечно, вам нужно будет настроить класс Имя, а также, добавив:

public String getFirstName(){ 
    return this.firstName; 
} 
+0

Я хочу, чтобы командной строки –

+0

@ K.Ji, я обновил ответ соответственно. – mcuenez

+0

Спасибо, я уже сделал это сейчас, как напечатать его по вертикали? –

0

если я понимаю ваш вопрос ну вот мой код, который решает эту проблему

public static void shortName(String shortName){ 

    System.out.println("please enter yout name : "); 
    Scanner scanner = new Scanner(System.in); 
    String fullName = scanner.nextLine(); 

    if(shortName.equals("sort")){ 
     String [] nameArr = fullName.split(" "); 
     int lastNameIndex = nameArr.length - 1; 
     String name = nameArr[0] +" "+ nameArr[lastNameIndex]; 
     System.out.println("welcome : "+name); 
    } 
    else { 
     System.out.println("welcome : "+fullName); 

    } 

} 
public static void main(String[] args) { 

    shortName("sort"); 
} 
+0

ввода будет из командной строки: sort «john main» «rob class» «bob ram» Выход: класс, rob main, john ram, bob –