2016-01-29 2 views
4

Прежде всего, я начинающий программист и имею только около 7 недель опыта программирования. Во-вторых, это для домашнего задания. Вот где я застрял.Значение строки для целого?

String curDay; 
String curDaylow; 
int sunday; 
int monday; 
int tuesday; 
int wednesday; 
int thursday; 
int friday; 
int saturday; 
sunday = 0; 
monday = 1; 
tuesday = 2; 
wednesday = 3; 
thursday = 4; 
friday = 5; 
saturday = 6; 
int dayNum; 

curDay = console.next(); 
curDaylow = curDay.toLowerCase(); 
dayNum = valueOf.curDaylow; 

То, что я пытаюсь сделать, - получить переменную dayNum равной значению строки. Пример. если пользователь вводит понедельник, программа сводит его ко всему нижнему региону в понедельник, а затем dayNum должно = 1. У меня уже есть Sun-Sat, объявляемое как значение INT, и каждый из них запускается с SUN = 0 и перемещается по линии на SAT = 6.

Поскольку это домашнее задание, я не ожидаю, что кто-то сделает это для меня, но, возможно, подтолкнет меня к тому, где я могу научиться этому. Или, возможно, скажите мне, что эта операция будет называться, поэтому я знаю, чтобы ее исследовать. Спасибо.

+0

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

+0

Я понял. Я считаю, что это то, о чем вы просите. Благодарим вас за такой быстрый ответ –

+0

Nudge: 'String.toLowerCase()' в нижний регистр (который у вас уже есть), а затем используйте ['switch'] (https://docs.oracle.com/javase /tutorial/java/nutsandbolts/switch.html). – yshavit

ответ

0

Бадди, вы делаете несколько ошибок, как вы определили переменные int как воскресенье, понедельник, вторник ...... и когда пользователь вводит строковое значение, вы ожидаете извлечь целочисленное значение из этой строки. Не возможно. Что вы можете сделать, это использовать случай переключения, и если вы используете java 1.7, вы можете передать свою входную строку в этот переключатель, а затем в случае, если вы можете определить кейс «sunday»: dayNum = 0; перерыв; Аналогичным образом введите все дни в случае. Надеюсь, поможет.

int dayNum; 
    String curDay; 
    String curDaylow; 
    curDay = console.next(); 
    curDaylow = curDay.toLowerCase(); 
    switch (curDaylow) { 
    case "sunday": 
     dayNum = 0; 
     break; 
    case "monday": 
     dayNum = 1; 
     break; 
    // Similarly write all cases for remaining days 
    } 
+1

@ abdulrafique, и @yshavit, спасибо, ребята, похоже, что переключатель - это путь. Да, довольно много промахов. Я очень начинаю программировать, а Java - это мой первый язык. Я дам переключателю выстрел и посмотрю, что произойдет. Еще раз спасибо за толкание и быстрый ответ. Это очень ценно. –

+0

, идущий по этому маршруту, вы можете исключить переменные 'String' и сделать' switch (console.next(). ToLowerCase()) ' –

+0

@CalvinP. Хотя это, безусловно, верно, я считаю, что хорошая привычка ставить то, что вы включаете в переменную, если это то, что не может быть легко восстановлено снова (что-то вроде 'console.next()' не может) , для отладки. Одной дополнительной строки вертикального пространства мало. Тем не менее, к ответчику (а также к OP) - вы можете (и должны) консолидировать объявление переменной и присваивание: 'String curDay = console.next()' и аналогично для 'curDayLow'. – yshavit

2
enum Day { 
    sunday(0),monday(1),tuesday(2),wednesday(3),thursday(4), 
    friday(5),saturday(6); 

    private final int value; 

    Day(int value) { 
     this.value = value; 
    } 

    int getValue() { 
     return value; 
    } 
} 

Теперь вы можете использовать:

Day m = Day.valueOf(curDay.toLowerCase()); 
int dayNum = m.getValue(); 
+1

У перечислений уже есть метод, который возвращает их позицию: 'порядковый()'. – Pshemo

+1

Я думаю, что это не очень хорошая практика, но это может сработать. Прочтите это: http://stackoverflow.com/questions/1574580/is-it-bad-practice-to-use-an-enums-ordinal-value-to-index-an-array-in-java, к тому же он не будет работа в более общем случае, где нумерация начинается не с 0 (я бы, например, понял бы, почему кто-то хотел бы иметь monday = 1, ... sunday = 7) – Gavriel

+1

Правда, у него есть свои недостатки, как это делает изменение позиции элементов сложнее, но в текущем случае ваш метод getValue() 'действует точно так же, как' порядковый() ', поэтому я упомянул об этом. Я не говорю, что ваше решение неверно (извините, если это было не ясно в моем первом комментарии). Я просто пытался указать на факт. – Pshemo

2

Извините, но вы делаете все это неправильно.

Во-первых, вы объясните, что не так. Вы говорите, что хотите, чтобы «dayNum был равен значению строки», но затем в примере «dayNum should = 1» - где 1 не является «значением строки». Я понимаю, что вы имеете в виду, но объяснение неверно сформулировано. Хотя это не очень важно.

Важно то, что вы ожидаете определенного уровня метапрограммирования, которого нет у Java. А именно, вы хотите работать с именами локальных переменных. Программа должна читать значение локальной переменной int monday, когда какая-либо другая локальная переменная имеет значение «понедельника». У Java этого нет. Вы могли бы сделать это с отражением, если int monday было полем класса, а не локальной переменной, но здесь возникает другая проблема - вы делаете все это неправильно.

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

Один из способов сделать это, чтобы иметь массив строк, содержащее название дней (строчный):

String[] days = new String[] { 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday' } 

Тогда можно обрезать и строчной ввод - curDay = console.next().trim().toLowerCase() - а затем цикл по массиву, чтобы найти значение соответствия, а индекс, при котором значение соответствует был бы ответ:

int dayNum = -1; 
for(int i=0; i<days.length; i++) { 
    if(days[i].equals(curDay) { 
     dayNum = i; 
     break; 
    } 
} 

Другим решением, которое было бы проще реализовать, быстрее работать, но, возможно, труднее понять, использовать карту (и самое трудное часть для понимания - это внутренности o е как реализации Карта работы - но вы абсолютно не нужно, чтобы это использовать их):

Map<String, Integer> daysOfWeek = new HashMap<String, Integer>(); 
daysOfWeek.put("sunday", 0); 
... 
daysOfWeek.put("saturday", 6); 

String curDay = console.next().trim().toLowerCase(); 
int dayNum = daysOfWeek.get(curDay); // Will throw null-pointer exception if value of curDay is not in the map. 

Также правильный способ сделать это было бы использовать Java API, для работы с датой - java.util.Calendar (ну, а java.text.DateFormatSymbols) - чтобы получить имена дней недели для определенного языкового стандарта. См. Этот ответ о том, как это сделать: In Java, how to get strings of days of week (Sun, Mon, ..., Sat) with system's default Locale (language)

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