2015-11-17 5 views
1

У меня есть входной файл input.txt со списком имен. У меня нет проблем отображать все имена и помещать их в алфавитном порядке с помощью методов отображения и сортировки. Но то, что я в настоящее время изо всех сил стараюсь сделать, это создать метод, в котором я могу подсчитать повторяемость каждого имени в файле. Я бы очень хотел, чтобы кто-нибудь мог мне помочь в этом, и найти способ создать этот метод.Метод подсчета Java

public class Names { 

public static void display(ArrayList<String> names) { 
    for (int i = 0; i < names.size(); i = i + 1) { 
     System.out.println(names.get(i)); 
    } 
} 

public static int find(String s, ArrayList<String> a) { 
    for (int i = 0; i < a.size(); i = i + 1) { 
     String str = a.get(i); 
     if (str.equals(s)) { 
      return i; 
     } 
    } 
    return -1; 

} 

public static void capitalize(ArrayList<String> names) { 
    for (int i = 0; i < names.size(); i = i + 1) { 
     String name = names.get(i); 
     if (!name.isEmpty()) { 
      String firstLetter = "" + name.charAt(0); 
      names.set(i, firstLetter.toUpperCase() + name.substring(1).toLowerCase()); 

     } 
    } 
} 

public static void sort(ArrayList<String> names) { 
    for (int i = 0; i < names.size() - 1; i = i + 1) { 
     int Min = i; 
     for (int j = i + 1; j < names.size(); j = j + 1) { 
      if (names.get(j).compareTo(names.get(Min)) < 0) { 
       Min = j; 
      } 
     } 
     String tmp = names.get(i); 
     names.set(i, names.get(Min)); 
     names.set(Min, tmp); 

    } 

} 

public static void getNames(ArrayList<String> fn, ArrayList<String> ln) throws IOException { 
    Scanner kb = new Scanner(System.in); 
    System.out.println("What is the input flie?"); 
    String names = kb.next(); 
    File inpFile = new File(names); 
    Scanner in = new Scanner(inpFile); 

    while (in.hasNext()) { 
     String firstName = in.next(); 
     String lastName = in.next(); 
     fn.add(firstName); 
     ln.add(lastName); 

    } 

} 

private int countOccurence(String name, ArrayList<String> names){ 
int count = 0; 
for(int i =0; i <= names.size; i++){ 
    if(name.equalsIgnoreCase(names.get(i))){ 
     count++; 
    } 
} 
return count; 

}

public static void main(String[] args) throws IOException { 

    ArrayList<String> first = new ArrayList<>(); 
    ArrayList<String> last = new ArrayList<>(); 
    getNames(first, last); 
    capitalize(first); 
    capitalize(last); 

    ArrayList<String> allNames = new ArrayList<>(); 
    for (int i = 0; i < first.size(); i++) { 
     allNames.add(last.get(i) + ", " + first.get(i)); 
    } 
    System.out.println("*******All Names******"); 

    sort(allNames); 
    display(allNames); 

    System.out.println("*****First Name Count***"); 

    for(int i =0; i <= first.size; i++){ 
    int count = countOccurence(first.get(i), first); 
System.out.println(first.get(i) + " occured " + count + " times."); 

}

System.out.println("****Last Name Count****"); 

    sort(last); 
    display(last); 

} 

}

+3

Покажите нам код. –

+0

Вам нужно отдельное количество для каждого имени, или вы будете вводить ввод имени для подсчета? Они предлагают другое решение. –

+0

Я разместил все методы, которые у меня есть, и основной метод, который у меня есть до сих пор. –

ответ

2

Use Map структура для тех случая:

Map<String, Integer> recurence = new HashMap<>(); 
int count; 
for (String name : names) { 
    if (recurence.containsKey(name)) { 
     count = recurence.get(name) + 1; 
    } else { 
     count = 1; 
    } 
    recurence.put(name, count); 
} 
+0

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

+0

Да, с этим вы можете построить структуру данных, такую ​​как ключ, это имя и значение - это время повторения, поэтому вы можете получить время повторения по каждому имени по запросу – codeaholicguy

+0

Намного лучшее решение, поскольку вам нужно только перебирать имя один раз, и вставки бывают быстрыми. O (n) для итерации и O (1) для put/get –

1

создать метод, который подсчитывает вхождения:

public static int countOccurence(String name, ArrayList<String> names){ 
    int count = 0; 
    for(int i =0; i <= names.size(); i++){ 
     if(name.equalsIgnoreCase(names.get(i))){ 
      count++; 
     } 
    } 
    return count; 
} 

Чтобы использовать его, пройти через петлю в вас Main (или вы можете создать другой метод)

for(int i =0; i <= first.size; i++){ 
    int count = countOccurence(first.get(i), first); 
    System.out.println(first.get(i) + " occured " + count + " times."); 
} 
+0

Я создал метод и попытался поставить то, что у вас есть для меня в основном методе, но он продолжает давать мне ошибку в основном методе, говоря, что у меня есть для создания метода countOccurence, даже если у меня его уже есть. Вы знаете, почему у меня может быть эта проблема? –

+0

Из метода, который вы мне дали, мне нужно создать строку, а затем список массивов на основе параметров, но что бы я ввел в создаваемую строку? –

+0

Извините, я забыл включить «Arraylist» в вызов метода. 'countOccurence (first.get (i), первый);' edit. – jmcg

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