2015-11-17 5 views
-1

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

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

В методе он дает ошибку в цикле for, в которой «размер имеет частный доступ в ArrayList». Затем в основном методе при вызове функции возникает другая ошибка, говорящая, что «нестационарный метод не может ссылаться на статический контекст».

+1

Какие ошибки? Какая строка дает ошибки? Являются ли они ошибками компилятора или ошибками во время выполнения? – phflack

+0

@phflack В фактическом методе он дает ошибку в цикле for, в которой «размер имеет частный доступ в ArrayList». Затем в основном методе при вызове функции возникает другая ошибка, говорящая, что «нестационарный метод не может ссылаться на статический контекст». –

+0

@phflack хорошо спасибо. Я попробую и дам вам знать, что произойдет. –

ответ

0

Вы используете first.size в своей петле. Так как вы используете список, вы должны использовать метод first.size() вашего ArrayList


Ваш второй вопрос вызова private int countOccurence() от вашего статического основного метода, что означает, что вы должны сделать это быть private static int countOccurence()

Ключевое слово static используется, когда метод/переменная распределяется между всеми экземплярами класса и не полагается на какой-либо конкретный экземпляр класса. В этом случае он просто принимает входной сигнал и выдает выходной сигнал и поэтому он может быть static, вместе с остальным ваших методами


Вашего IndexOutOfBoundsException вызвано беловатым одной ошибкой, вы читаете один слишком далеко в вашей цикл

в вашем методе countOccurence, ваш цикл будет один слишком далеко, изменить

for(int i = 0; i <= names.size; i++) 

в

for(int i = 0; i < names.size(); i++) 

в качестве альтернативы вы можете использовать цикл Еогеасп вместо этого и не приходится иметь дело со счетчиком, а не рисковать выходить за пределы

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

Итак, я запустил его и получил несколько разных ошибки сейчас. * Исключение в потоке «main» java.lang.IndexOutOfBoundsException: Index: 18, Size: 18 \t at java.util.ArrayList.rangeCheck (ArrayList.java:638) в java.util.ArrayList.get (ArrayList.java:414) \t по именам.Names.countOccurence (Names.java:84) \t по именам.Names.main (Names.java:111) Java Результат: 1 * –

+0

@KevinPaz Обновлено с тем, что вызывает исключение из-за пределов – phflack

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