2013-12-01 6 views
1

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

This is my list.

И вот мой код:

Имя

public class Name{ 

private String givenName; 
private int[] ranks = new int[11]; 

public Name(String name, int[] popularityRanks){ 
    givenName = name; 

    for (int i = 0; i < 11; i++){ 
     ranks[i] = popularityRanks[i]; 
    } 
} 

public String getName(){ 
    return givenName; 
} 

public int getPop(int decade){ 
    if (decade >= 1 && decade <= 11){ 
     return ranks[decade]; 
    } 
    else{ 
     return -1; 
    } 
} 

public String getHistoLine(int decade){ 
    String histoLine = ranks[decade] + ": "; 

    return histoLine; 
} 

public String getHistogram(){ 
    String histogram = ""; 

    for (int i = 0; i < 11; i++){ 
     histogram += ranks[i] + ": " + this.getHistoLine(i) 
       + "\n"; 
    } 

    return histogram; 
} 
} 

А потом NameApp:

import java.util.Scanner; 
import java.io.File; 
import java.io.FileNotFoundException; 

public class NameApp{ 

private static boolean validInput; 
private static boolean stillWorking = true; 
private static boolean validDecade; 

static Scanner keyboard = new Scanner(System.in); 

public static void main(String[] args) throws FileNotFoundException{ 
    String[] nameArray = readNamesFile(); 
    Name[] list = new Name[nameArray.length]; 

    loadNames(list, nameArray); 

    char choice; 

    do { 

     do { 

      displayMenu(); 
      choice = getUserInput(); 

     } while (!validInput); 

     switch (choice){ 
      case 'A': 
        displayHistogram(list); 
       break; 
      case 'B': 
        compareTwoNames(list); 
       break; 
      case 'C': 
        displayTopTenNames(list); 
       break; 
      case 'D': 
        writeAnomaliesToFile(list); 
        stillWorking = false; 
       break; 
      default: 
       break; 
     } 

    } while (stillWorking); 
} 

private static String[] readNamesFile() throws FileNotFoundException{ 
    String[] nameArray = new String[4429]; 

    Scanner inputStream = null; 
    String fileName = "names.txt"; 
    inputStream = new Scanner (new File(fileName)); 

    int i = 0; 

    while (inputStream.hasNextLine()){ 
     nameArray[i] = inputStream.nextLine(); 

     i++; 
    } 

    inputStream.close(); 
    return nameArray; 
} 

private static void loadNames(Name[] list, String[] nameArray){ 
    int length; 
    int spacePos; 
    int[] popRanks = new int[11]; 
    String name; 
    String linePop; 

    for (int i = 0; i < nameArray.length; i++){ 
     length = nameArray[i].length(); 

     spacePos = nameArray[i].indexOf(" "); 

     name = nameArray[i].substring(0,spacePos); 
     linePop = nameArray[i].substring(spacePos + 1, length); 

     for (int j = 0; j < 11; j++){ 
      popRanks[j] = Integer.parseInt(linePop.split(" ")[j]); 
     } 

     list[i] = new Name(name, popRanks); 
    } 
} 

private static void displayMenu(){ 
    System.out.println("Enter the character corresponding to your selection:"); 
    System.out.println("\ta - Print histogram for a name"); 
    System.out.println("\tb - Compare two names in a decade"); 
    System.out.println("\tc - Print top ten names for a decade"); 
    System.out.println("\td - Quit (display file anomalies)"); 
} 

private static char getUserInput(){ 

    String selection = keyboard.nextLine(); 
    System.out.println(" Your selection: " + selection); 

    checkUserInput(selection); 

    char choice = stringToChar(selection); 

    return choice; 
} 

private static boolean checkUserInput(String selection){ 

    if (!selection.equalsIgnoreCase("a") && !selection.equalsIgnoreCase("b") && !selection.equalsIgnoreCase("c") && !selection.equalsIgnoreCase("d")){ 
     System.out.println("Invalid input. Try again..."); 
     return validInput = false; 
    } 
    else {   
     return validInput = true; 
    } 

} 

private static char stringToChar(String selection){ 
    char choice = selection.charAt(0); 

    choice = Character.toUpperCase(choice); 

    return choice; 
} 

private static void displayHistogram(Name[] list){ 
    String nameInput; 
    String histogram; 
    int nameLocation; 

    nameInput = nameEntry(); 

    nameLocation = checkListArray(nameInput, list); 

    histogram = list[nameLocation].getHistogram(); 

    System.out.println("Histogram for name, " + list[nameLocation].getName() + ":"); 
    System.out.println(histogram); 
} 

private static void compareTwoNames(Name[] list){ 
    String nameOne; 
    String nameTwo; 
    String oneHistoLine; 
    String twoHistoLine; 
    int oneLocation; 
    int twoLocation; 
    int decade; 

    nameOne = nameEntry(); 
    oneLocation = checkListArray(nameOne, list); 

    nameTwo = nameEntry(); 
    twoLocation = checkListArray(nameTwo, list); 

    decadeMenu(); 
    decade = decadeSelection(); 

    oneHistoLine = list[oneLocation].getHistoLine(decade); 
    twoHistoLine = list[twoLocation].getHistoLine(decade); 

    System.out.println("Data for " + list[oneLocation].getName()); 
    System.out.println(" " + oneHistoLine); 
    System.out.println("Data for " + list[twoLocation].getName()); 
    System.out.println(" " + twoHistoLine); 
} 

private static void displayTopTenNames(Name[] list){ 
    int decade; 
    int temp = 1000; 
    int tempTwo; 
    String[] topTen = new String[20]; 

    decadeMenu(); 
    decade = decadeSelection(); 

    for (int i = 0; i < 20; i++){ 
     for (int j = 0; j < list.length; j++){ 
      if (list[j].getPop(decade) > 0 && list[j].getPop(decade) < temp){ 
       temp = list[j].getPop(decade); 
       tempTwo = 
      } 
     } 
    } 

} 

private static void writeAnomaliesToFile(Name[] list){ 

} 

private static String nameEntry(){ 
    String nameInput = ""; 

    System.out.println("Enter a name: "); 

    nameInput = keyboard.nextLine(); 

    return nameInput; 

} 

private static int checkListArray(String nameInput, Name[] list){ 
    int nameLocation = -1; 
    int listLength = list.length; 

    for (int i = 0; i < listLength; i++){ 
     if (nameInput.equalsIgnoreCase(list[i].getName())){ 
      return nameLocation = i; 
     } 
    } 

    if (nameLocation == -1){ 
     System.out.println("The name, " + nameInput + ", was not found!"); 
     return nameLocation; 
    } 
    return nameLocation; 
} 

private static void decadeMenu(){ 
    System.out.println("Enter number correpsonding to your decade:"); 
    System.out.println(" 1 - 1900-1909"); 
    System.out.println(" 2 - 1910-1919"); 
    System.out.println(" 3 - 1920-1929"); 
    System.out.println(" 4 - 1930-1939"); 
    System.out.println(" 5 - 1940-1949"); 
    System.out.println(" 6 - 1950-1959"); 
    System.out.println(" 7 - 1960-1969"); 
    System.out.println(" 8 - 1970-1979"); 
    System.out.println(" 9 - 1980-1989"); 
    System.out.println(" 10 - 1990-1999"); 
    System.out.println(" 11 - 2000-2005"); 
} 

private static int decadeSelection(){ 
    String decadeChoice; 
    int decade; 

    do { 
     System.out.println("Enter a decade: "); 
     decadeChoice = keyboard.nextLine(); 

     decade = checkDecade(decadeChoice); 

    } while (!validDecade); 

    return decade; 
} 

private static int checkDecade(String decadeChoice){ 
    int decade = 0; 

    try { 
     decade = Integer.parseInt(decadeChoice); 
    } 
    catch (Exception e){ 
     System.out.println("That is not an integer. Please try again."); 

     return decade; 
    } 

    if (decade < 1 || decade > 11){ 
     System.out.println("Enter an integer between 1 and 11"); 

     validDecade = false; 
     return decade; 
    } 
    else { 
     validDecade = true; 

     return decade; 
    } 
} 
} 

так где мне нужна помощь в это метод displayTopTenNames. Я уже немного разбирался с ним немного раньше, но каждый цикл, который я придумал, всегда делает дубликаты, которые мне не нужны ... Во всяком случае мой вывод должен выглядеть так:

Десять самых популярных имен (мужской и женщины) в течение десятилетия 1910-1919 были:

Джон (1) Мария (1)
Helen (2) Уильям (2)
Дороти (3) Джеймс (3)
Margaret (4) Роберт (4)
Joseph (5) Ruth (5)
George (6) Mildred (6)
Anna (7) Чарльз (7)
Эдвард (8) Элизабет (8)
Frances (9) Франк (9)
Marie (10) Вальтер (10)

так что да помощь была бы оценена и спасибо заранее. Метод

+1

Почему бы не использовать [SortedSet] (http://docs.oracle.com/javase/6/docs/api/java/util/SortedSet.html)? –

ответ

0

Есть, вероятно, более эффективные способы сделать это, но это показывает теория. Вы сохраняете небольшой список из 20 предметов. Вы просматриваете свой большой список, чтобы узнать, является ли его кандидатом для вашего короткого списка. Если список меньше 20, все добавляется. Если он достиг 20, вы проверяете, больше ли что-либо в списке, чем элемент, который вы хотите добавить. если это так, этот элемент выселяется и заменяется меньшим значением.

public class Low20 { 
    private List<Integer> list = new ArrayList<Integer>(); 

    public static final void main(String[] args) { 
     new Low20(); 
    } 

    public Low20() { 
     Random random = new Random(); 
     for (int x=0;x<100000;x++) { 
      add(random.nextInt(100000)); 
     } 
     System.out.println(list); 
    } 

    public void add(int value) { 
     if (list.size() < 20) { 
      list.add(value); 
     } else { 
      for (int x=0;x<list.size();x++) { 
       if (list.get(x) > value) { 
        list.remove(x); 
        list.add(value); 
        return; 
       } 
      } 
     } 
    } 
} 

В результате. (случайные числа, но самые низкие 20). Затем вы можете отсортировать их или включить сортировку в алгоритм выселения.

[6, 0, 5, 17, 18, 11, 10, 27, 22, 27, 28, 16, 34, 33, 0, 8, 28, 0, 15, 14]

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

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