2015-01-24 5 views
0

Я работаю над программой, которая будет проходить через список записей (идентификаторы и билеты) и проанализировать их на два списка соответственно. Он также перекрестно просматривает списки, чтобы узнать, какие идентификаторы имеют соответствующий билет на основе имен. Вот ссылка на более раннюю версию: here Теперь я переписываю с помощью некоторого кода C# от коллеги, но у меня возникают проблемы с методом парсинга. Вот C# версии:ArrayIndexOutOfBoundsException конвертирование C# в Java

 public void parseLine(string _line) 
    { 
     if(string.IsNullOrWhiteSpace(_line)){ return;} 

     code  = _line.Substring(0, 3); 
     ticketID = _line.Substring(3, 10); 

     string tmp = _line.Substring(13).Trim(); 

     //get the first and last name 
     string [] tmp1 = tmp.Split(",".ToCharArray()); 

     if(!(tmp1.Length > 1)) 
     { 
      throw new Exception("unable to get the first and last name"); 
     } 

     lastname  = tmp1[0]; 
     firstname  = tmp1[1].Trim(); 

    } 

Вот моя версия Java:

public void parseLine(String line) throws Exception { 
      // code will store Ticket code *Alpha ticketId will store 10 
      // *digit code 
    code = line.substring(0, 3); 
    ticketId = line.substring(3, 10); 

      // tmp will store everything afterthe first 13 characters of 
      // line and trim the name(s) 
    String tmp = line.substring(13).trim(); 

      // tmp1 array 
    String[] tmp1 = tmp.split(".*,.*"); 

    if (tmp1.length > 1) { 

     throw new Exception("UNABLE TO GET NAME"); 

    } 

    last = tmp1[0]; 
    first = tmp1[1].trim(); 
} 

Это в отдельном классе, который будет моделировать людей с билетами. Мой главный класс (до сих пор), который вызывает фактический метод parseLine выглядит следующим образом:

public class ParkingTickets { 

public static void main(String[] args) throws 
     FileNotFoundException, Exception { 

ArrayList<TicketPeople> tickets = new ArrayList<>(); 
HashMap<String, List<SbPeople>> people = new HashMap<>(); 
File srcFile = new File("source.txt"); 

Scanner myScanner = new Scanner(srcFile); 

    while (myScanner.hasNextLine()) { 
    String line = myScanner.nextLine(); 
    //System.out.println(line); 
    if (line.matches("^\\p{Alpha}.*$")) { 
    //System.out.printf("Ticket: %s%n", line); 
     TicketPeople t = new TicketPeople(); 
     t.parseLine(line); 
     tickets.add(t); 
     } 
     myScanner.close(); 
    } 

} 

}

точки компилятора в, если заявление в методе parseLine, и, очевидно, метод parseLine в основном классе, когда я попытался пройти через эту строку sepcifiv, я вижу, что он начинает синтаксический анализ данных из исходного файла, но что-то не работает. Из документации ошибка означает: Бросить, чтобы указать, что к массиву был обращен незаконный индекс. Индекс является либо отрицательным, либо большим или равным размеру массива. Я использовал ArrayList для списка билетов и, насколько я понимаю, это динамический список, который не нужно устанавливать с определенным размером индекса. Я все еще участвую, и мне трудно понять это исключение. Я был бы очень признателен за любую помощь.

ответ

0

1) В C# это подстрока (int startIndex, int length). В подстроке java String (int startindex, int endindex).

2) Код java также изменил логику исключения. В коде C# это не if (! (Tmp1.Length> 1)), тогда как в java-коде if (tmp1.length> 1)

+0

# 2 является одной из причин избежать использования '!', Когда есть простой способ свести на нет условие. Версия C# должна быть написана 'if (temp1.Length <= 1)', и тогда было бы намного сложнее сделать эту ошибку. – ajb

+0

Полностью согласовано. – Lekha

1

Ваш вызов split() в Java, не соответствует split() с C#.

// String[] tmp1 = tmp.split(".*,.*"); 
String[] tmp1 = tmp.split(","); // <-- ",". 

также, ваша логика проверки, похоже, была отменена. Но, я бы предложил

if (tmp1.length != 2) { 
    throw new Exception("UNABLE TO GET NAME"); 
} 
+0

Я пытаюсь вспомнить, почему я изменил split() в моем Java-код. Думаю, я пытался написать регулярное выражение, указывающее что-либо до или после «,» разделителя. И моя логика для условия была определенно выключена, должно быть указано, если tmp1 меньше или равно 1 ... правильно? Тогда мой вопрос был бы, если бы я использовал (tmp1.length! = 2), это было бы лучше более точное/эффективное условие? –

+0

@ Luis Я так думаю. Вам нужны два (и только два элемента). –

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