2014-09-19 2 views
-1

그래서이 프로그램에서는 사용자로부터 세 개의 문자열을 얻어 알파벳 순으로 정렬해야합니다. 주의해야 할 점은 배열을 사용할 수 없다는 것입니다. 또한 문자열이 영문자로 시작하지 않으면 허용되지 않습니다. 지금까지 나는 사용자로부터 세 문자열을 얻었고이를 받아 들여야하는지 아닌지를 결정할 수있었습니다. 내가 알 수없는 것은 사전 순으로 정렬하는 방법입니다. 내가 가지고있는 주요 문제는 정렬 할 때 받아 들여지지 않은 문자열을 무시하는 것이다. 다음은 사용자로부터 문자열을 가져 오는 코드입니다.자바에서 배열없이 알파벳순으로 문자열 정렬

Scanner scan = new Scanner(System.in); 

    System.out.print("Please input the first name: "); 
    String name1 = scan.nextLine(); 
    name1 = name1.substring(0, 1).toUpperCase() + name1.substring(1,name1.length()).toLowerCase(); 
    if (name1.charAt(0) >= 'A' && name1.charAt(0) <= 'Z'){ 
     System.out.println("The first name is: " + name1); 
    }else{ 
     System.out.println("Error: The name was not accepted"); 
     name1 = null; 
    } 

    System.out.print("Please input the second name: "); 
    String name2 = scan.nextLine(); 
    name2 = name2.substring(0, 1).toUpperCase() + name2.substring(1,name2.length()).toLowerCase(); 
    if (name2.charAt(0) >= 'A' && name2.charAt(0) <= 'Z'){ 
     System.out.println("The second name is: " + name2); 
    }else{ 
     System.out.println("Error: The name was not accepted"); 
     name2 = null; 
    } 

    System.out.print("Please input the third name: "); 
    String name3 = scan.nextLine(); 
    name3 = name3.substring(0, 1).toUpperCase() + name3.substring(1,name3.length()).toLowerCase(); 
    if (name3.charAt(0) >= 'A' && name3.charAt(0) <= 'Z'){ 
     System.out.println("The third name is: " + name3); 
    }else{ 
     System.out.println("Error: The name was not accepted"); 
     name3 = null; 
    } 
+0

왜 배열을 사용할 수없는 이유는 무엇입니까? 'Arrays.sort'는 정렬 작업을 수행하는 위대하고 간단한 방법입니다 ... – Krease

+2

숙제 때문입니다. 공정하게 말하면, 이것은 "나를 위해 숙제를 하느라."는 경우가 아닙니다. –

+1

어리석은 요구 사항을 감안할 때, 나는'( data) *'라는 단 하나의 거대한 문자열을 만든 다음 매번 다시 작성하고 삽입 정렬을 수행 할 것입니다. –

답변

1

이 솔루션을 생각해 냈습니다. 배열없이이 코드를 작성하는 것은 가독성의 악몽입니다.

import java.util.Scanner; 

public class NameSort { 

    private static final Scanner scan = new Scanner(System.in); 

    public static void nameStort() { 
    String name1 = readName("first"); 
    String name2 = readName("second"); 
    String name3 = readName("third"); 

    String potentialName1 = null; 
    String potentialName2 = null; 
    String potentialName3 = null; 
    String potentialName4 = null; 
    String potentialName5 = null; 
    String potentialName6 = null; 
    String potentialName7 = null; 

    if (name1 == null) { 
     if (name2 == null) { 
     potentialName4 = name3; 
     } else { 
     potentialName4 = name2; 
     if (name3 != null) { 
      if (name2.compareTo(name3) > 0) { 
      potentialName2 = name3; 
      } else { 
      potentialName6 = name3; 
      } 
     } 
     } 
    } else { 
     potentialName4 = name1; 
     if (name2 == null) { 
     if (name3 != null) { 
      if (name1.compareTo(name3) > 0) { 
      potentialName2 = name3; 
      } else { 
      potentialName6 = name3; 
      } 
     } 
     } else { 
     if (name1.compareTo(name2) > 0) { 
      potentialName2 = name2; 
     } else { 
      potentialName6 = name2; 
     } 
     if (name3 != null) { 
      if (name1.compareTo(name3) > 0) { 
      if (name2.compareTo(name3) > 0) { 
       potentialName1 = name3; 
      } else { 
       potentialName3 = name3; 
      } 
      } else { 
      if (name2.compareTo(name3) > 0) { 
       potentialName5 = name3; 
      } else { 
       potentialName7 = name3; 
      } 
      } 
     } 
     } 
    } 
    System.out.println("The sorted names are: "); 
    printIfNotNull(potentialName1); 
    printIfNotNull(potentialName2); 
    printIfNotNull(potentialName3); 
    printIfNotNull(potentialName4); 
    printIfNotNull(potentialName5); 
    printIfNotNull(potentialName6); 
    printIfNotNull(potentialName7); 
    } 

    private static void printIfNotNull(String potentialName) { 
    if (potentialName != null) { 
     System.out.println(potentialName); 
    } 
    } 

    public static String readName(String position) { 
    System.out.print("Please input the " + position + " name: "); 
    String name = toTitleCase(scan.nextLine().trim()); 
    if (!name.isEmpty() && Character.isLetter(name.charAt(0))) { 
     System.out.println("The " + position + " name is: " + name); 
     return name; 
    } else { 
     System.out.println("Error: The name was not accepted"); 
    } 
    return null; 
    } 

    public static String toTitleCase(String word) { 
    if (word.isEmpty()) { 
     return word; 
    } 
    // one way to do it 
    return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase(); 
    } 

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

그러나 지정에서 바보 배열 또는 수집 제한없이

코드는 훨씬 더 읽을 수 있습니다 : 여기 궁금 그 중 어떤

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

public class NameSort { 

    private static final Scanner scan = new Scanner(System.in); 

    public static void nameStort() { 
    List<String> names = Arrays.asList(readName("first"), readName("second"), readName("third")); 
    Collections.sort(names); 
    for (String name : names) { 
     printIfNotEmpty(name); 
    } 
    } 

    private static void printIfNotEmpty(String name) { 
    if (!name.isEmpty()) { 
     System.out.println(name); 
    } 
    } 

    public static String readName(String position) { 
    System.out.print("Please input the " + position + " name: "); 
    String name = toTitleCase(scan.nextLine().trim()); 
    if (!name.isEmpty() && Character.isLetter(name.charAt(0))) { 
     System.out.println("The " + position + " name is: " + name); 
     return name; 
    } else { 
     System.out.println("Error: The name was not accepted"); 
    } 
    return ""; 
    } 

    public static String toTitleCase(String word) { 
    if (word.isEmpty()) { 
     return word; 
    } 
    // one way to do it 
    return word.substring(0, 1).toUpperCase() + word.substring(1).toLowerCase(); 
    } 

    public static void main(String[] args) { 
    nameStort(); 
    } 
} 
+1

Java에 대한 사용자의 경험을 감안할 때이 작업이 복잡합니까? – MarGar

+1

@MarGar이 어리석은 과제에 대한 해결책은 너무 복잡 할 것이며, 자바에서 좀 더 경험이 많았더라도 확실히 읽을 수 없을 것입니다. 문제의 제약 조건을 감안할 때 그 문제를 해결하는 방법을 모릅니다. – nmore

+1

참으로. +1하고 잘하면 그는 그것을 사용할 수 있습니다. – MarGar

0

는 말도 제약에 대해,이 문제에 대한 내 솔루션입니다. 공용 클래스 Assignment3 {

public static void main(String[] args) { 
    //read names and return error if the name starts with a non-alphabetic character 
    Scanner scan = new Scanner(System.in); 

    System.out.print("Please input the first name: "); 
    String name1 = scan.nextLine(); 
    name1 = name1.substring(0, 1).toUpperCase() + name1.substring(1,name1.length()).toLowerCase(); 
    if (Character.isLetter(name1.charAt(0))){ 
     System.out.println("The first name is: " + name1); 
    }else{ 
     System.out.println("Error: The name was not accepted"); 
     name1 = ""; 
    } 

    System.out.print("Please input the second name: "); 
    String name2 = scan.nextLine(); 
    name2 = name2.substring(0, 1).toUpperCase() + name2.substring(1,name2.length()).toLowerCase(); 
    if (Character.isLetter(name2.charAt(0))){ 
     System.out.println("The second name is: " + name2); 
    }else{ 
     System.out.println("Error: The name was not accepted"); 
     name2 = ""; 
    } 

    System.out.print("Please input the third name: "); 
    String name3 = scan.nextLine(); 
    name3 = name3.substring(0, 1).toUpperCase() + name3.substring(1,name3.length()).toLowerCase(); 
    if (Character.isLetter(name3.charAt(0))){ 
     System.out.println("The third name is: " + name3); 
    }else{ 
     System.out.println("Error: The name was not accepted"); 
     name3 = ""; 
    } 
    //Sort the names alphabetically 
    String first = ""; 
    if(name1.compareTo(name2) <= 0 && name1.compareTo(name3) <= 0){ 
     first = name1; 
    }else if (name2.compareTo(name3) <= 0 && name2.compareTo(name1) <= 0){ 
     first = name2; 
    }else if (name3.compareTo(name1) <= 0 && name3.compareTo(name2) <=0){ 
     first = name3; 
    } 

    String middle = ""; 
    if (name1.compareTo(name2)*name1.compareTo(name3) <= 0){ 
     middle = name1; 
    }else if (name2.compareTo(name1)*name2.compareTo(name3) <= 0){ 
     middle = name2; 
    }else if (name3.compareTo(name2)*name3.compareTo(name1) <= 0){ 
     middle = name3; 
    } 

    String last = ""; 
    if(name1.compareTo(name2) >= 0 && name1.compareTo(name3) >= 0){ 
     last = name1; 
    }else if (name2.compareTo(name3) >= 0 && name2.compareTo(name1) >= 0){ 
     last = name2; 
    }else if (name3.compareTo(name1) >= 0 && name3.compareTo(name2) >=0){ 
     last = name3; 
    } 
    if(first.isEmpty() && middle.isEmpty()){ 
     System.out.printf("The only name is \"%s\" ", last); 
    }else if(first.isEmpty()){ 
     System.out.printf("the names are \"%s\"and \"%s\" ",middle,last); 
    }else{ 
     System.out.printf("the names are \"%s\", \"%s\", and \"%s\" ",first,middle,last); 
    } 
} 

}