Страницы

Поиск по вопросам

пятница, 21 июня 2019 г.

Некорректная работа ввода с консоли

cki = Console.ReadKey(true); if (cki.Key == ConsoleKey.Escape) break;
var choice = Console.ReadLine();
switch (choice) { case "1": Console.WriteLine("1"); break; case "2": Console.WriteLine("2");; break; case "3": Console.WriteLine("3"); break; }
Проблема в том, что при попытки ввести допустим "1", приходится нажимать дважды на клавишу. Я подозреваю,что это из-за подряд идущих Console.ReadKey и Console.ReadLine. Как можно исправить эту проблему?


Ответ

Единственный вариант, который я вижу, — создать свою альтернативу Console.ReadLine(), которая будет реагировать не только на Enter, но и на Escape:
///

/// Console extensions. /// public static class ConsoleEx { /// /// Reads the next line of characters from the standard input stream. /// /// /// A line of characters read from the input stream, or null if ESC was pressed. /// public static string TryReadLine() { StringBuilder builder = new StringBuilder();
for (;;) { ConsoleKeyInfo info = Console.ReadKey(true);
switch (info.Key) { case ConsoleKey.Enter: Console.WriteLine(); return builder.ToString();
case ConsoleKey.Escape: return null;
default: Console.Write(info.KeyChar); builder.Append(info.KeyChar); break; } } } }
Использование в вашем случае будет таким:
string choice = ConsoleEx.TryReadLine();
switch (choice) { case "1": case "2": case "3": Console.WriteLine(choice); break; case null: // Handle ESC here. break; default: Console.WriteLine("Invalid input"); break; }

Переадресация всех запросов с не существующих поддоменов на главную

Что необходимо сделать чтобы все запросы,которые идут на не существующие поддомены,отправлялись на главную основы?(что-то слышал про вариант 404,но он не подходит).
Сейчас при попытке достучаться до не существующего саба получаю ошибку от браузера,якобы сервер не доступен.
Пробовал указывать что-то подобное,история повторяется:
Мне недавно на ухо шепнули,что нужно еще как-то правильно сконфигурировать .htaccess...


Ответ

Добавить в DNS вот такую запись думаю будет достаточно:
*.mywebsite.ru CNAME mywebsite.ru
От автора вопроса: важно учитывать что проблема не решится только при указании данного в ДНС домена.Здесь нужно сконфигурировать правильно конфигурационные файлы NGINX\APACHE (если у вас все вместе и NGINX как прокси-сервер,то править скорее всего нужно только его).

Нужно создать ArrayList, элементами которого будет Queue

У меня не получается инициализировать его.
ArrayList> colors = new ArrayList>(); colors.ensureCapacity(l+1); colors.get(0).add(new Pair(1, 1, 0));
Ругается на последнюю строчку


Ответ

Вы запрашиваете первый элемент, которого нет, и пытаетесь у него вызвать метод add
Что-то вроде такого:
import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue;
...
static class Pair { public Pair(int a, int b, int c) {} }
...
ArrayList> colors = new ArrayList>(); colors.add(new LinkedList()); colors.get(0).add(new Pair(1, 1, 0));
Queue -- интерфейс, поэтому нельзя создавать его объекты, а нужно использовать классы, реализующие данный интерфейс.

Проблема с углами в круглой кнопки

У меня есть ListView, а в элементе списка есть круглая кнопка.
Делал ее круглой так:

Выглядит она круглой, но при нажатии на элемент видно квадрат кнопки:

Как можно сделать, чтоб кнопка даже при нажатии на элемент оставалась круглой?


Ответ


Но лучше разделять логику состояния\рисунок

Регулярное выражение: минимум одна буква верхнего регистра


не могу понять, как изменить регулярное выражение, чтоб получить условие минимум одной буквы верхнего регистра, не обязательно ПЕРВОЙ


Ответ

Поле пароля: Минимум 8 символов, одна цифра, одна буква в верхнем регистре и одна в нижнем
^(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.
])(?=.*[A-Z])(?=.*[a-z]).*$
Взял отсюда

Как сделать так, что ActionBar не показывался на экране?

Я делаю popUp, мне просто необходимо, чтоб выскакивала своего рода всплывающая подсказка с коротким описанием. Я это делаю с помощью создания активити и задаю ему размеры и вроде как получается то, что я хочу. Но проблема в том, что как и у любого активити у него есть actionBar который смотрится не кстати))
В общем вот так

Я пробовал вот такую строчку добавлять
@Override protected void onCreate(Bundle savedInstanceState) {
--->> requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState); setContentView(R.layout.activity_pop);
но ничего не меняется абсолютно...
Подскажите как это сделать? Тем более я знаю, что это широко используется в играх, так как там каждый миллиметр экрана важен...
Я кстати не знаю имеет ли это значение или нет, но у меня андроид 5.0
Пробовал создать свой стиль вот так

и вот так присваиваю его в манифесте

Но ничего не помогает


Ответ

Создайте стиль для активити. Пропишите в нём
false true Присвойте его активити либо в манифесте, либо в коде до вызова super.onCreate(savedInstanceState);

Так же может помочь установка класса актвити на расширение Activity вместо AppCompatActivity

Выборка расписания с сайта - Java

Пытаюсь сделать приложение, которое будет парсить страницу с расписанием автобуса и выводить его.
Суть в том, чтобы расписание бралось первой остановки и если автобус будет не раньше, чем текущее время. То есть, если сейчас время 18:10, то надо вывести все оставшееся расписание с 18:10.
http://mybuses.ru/moscow/bus/734/
В идеале был бы показ только 3 автобусов, которые ближе всего к текущему времени.
class main extends AsyncTask{
String Bus1,Sys_time,wtf;
@Override protected Void doInBackground(Void... params) {
String table=""; String time; Integer first,second; final Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); Date date = cal.getTime(); Integer mHour = date.getHours(); Integer mMinute = date.getMinutes(); if(mMinute<10){ mMinute=date.getMinutes()+10; } String curr_time=mHour.toString()+":"+mMinute.toString();
Document doc; try { doc = Jsoup.connect("http://mybuses.ru/moscow/bus/734/").get(); Element table_site=doc.select("table").get(0); Element rows1=table_site.select("tr").get(1);
Iterator rowIterator=table_site.select("tr").iterator(); rowIterator.next(); Integer str1,str2,str3,str4;
while (rowIterator.hasNext()) { Element e = doc.select("tr").get(2); String e_1=e.attr("class"); str1=e_1.indexOf("-"); str2=e_1.indexOf(":"); str3=e_1.indexOf("-"); str4 = e_1.indexOf(":"); first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2))); second = Integer.parseInt(e_1.substring(str2+1, e_1.indexOf(str2+2)));
if (first>=mHour && second>=mMinute) { Element rows=table_site.select("tr").get(1); Element record1=rows.select("td").get(1); Iterator time1=record1.select("td").iterator(); wtf = time1.next().text(); } else { wtf="1232132132"; } } Element record2=rows1.select("td").get(6); Iterator time2=record2.select("td").iterator();
table="Автобус прибудет на Ст. Солнечная в "+wtf+" (через n минут)
Автобус прибудет на ГМС3 в "+time2.next().text(); } catch (IOException e) { e.printStackTrace(); }
Bus1=table; Sys_time=curr_time;
return null;
}
@Override protected void onPostExecute(Void result) { super.onPostExecute(result);
textView.setText("Текущее время: "+Sys_time+"

Расписание автобусов:
"+Bus1); } }
В этом коде ошибка:
Caused by: java.lang.StringIndexOutOfBoundsException: length=41; regionStart=23; regionLength=-24
в строке
first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2)));
Как ее можно исправить? В моей задумке было получить время из названия класса на сайте, т.к. в названии класса указано время первой остановки sh2 columnIsVisible 0-05:26-01-0002-0001, где 05:26 - время. Попытался вырезать это время и сравнить с текущим.


Ответ

Исключение вам английским языком говорит что вы вышли за границы строки.
А теперь попробуем разобрать фрагмент вашего кода.
str1 = e_1.indexOf("-"); ... ... first = Integer.parseInt(e_1.substring(str1+1, e_1.indexOf(str1+2)));
в строке e_1 строка для парсинга. в целочисленной переменной str1 индекс символа - в переменную first хотим получить целое число, в которое преобразуется строка из двух символов после символа -
Тут все понятно. А вот дальше начинается интересное.
e_1.indexOf(str1+2) - тут вы пытаетесь найти индекс вхождения в исходную строку символа, который является суммой чисел от индекса str1+2. Т.е. собственно нелогичная и некорректная операция. Думаю что вполне можно заменить это просто нв str1+3. +3 - потому что конечный индекс не включается в результат операции.
Т.е. код должен быть.
first = Integer.parseInt(e_1.substring(str1+1, str1+3));
Аналогично и для получения переменной second