Monthly Archives: Май 2014

Сделать в слове первую букву заглавной (Java)

Для того чтобы сделать первую букву в слове заглавной, напишем собственную функцию firstUpperCase. Функция firstUpperCase будет принимать слово, а возвращать тоже слово, но с первой заглавной буквой.

public String firstUpperCase(String word){
	if(word == null || word.isEmpty()) return "";//или return word;
	return word.substring(0, 1).toUpperCase() + word.substring(1);
}

word.substring(0, 1) — возвращает первую букву в слове
word.substring(0, 1).toUpperCase() — переводит первую букву в верхний регистр
word.substring(1) — добавляет остальные символы без изменения
Пример использования:

String var = "name";
System.out.println("get" + firstUpperCase(var) + "()");//Выведет: "getName()"

FastScanner — ускоряем чтение данных

Стандартный класс Scanner из пакета java.util очень хорош для чтения небольшого кол-ва данных, но если кол-во данных большое и скорость чтения критична, то нужно самостоятельно реализовать более быстрый сканер. Ниже приведен пример такого сканера.

import java.io.*;
import java.util.StringTokenizer;
 
public class FastScanner {
	BufferedReader br;
	StringTokenizer st;
 
	public FastScanner(){
		init();
	}
 
	public FastScanner(String name) {
		init(name);
	}
 
	public FastScanner(boolean isOnlineJudge){
		if(!isOnlineJudge || System.getProperty("ONLINE_JUDGE") != null){
			init();
		}else{	
			init("input.txt");			
		}
	}
 
	private void init(){
		br = new BufferedReader(new InputStreamReader(System.in));
	}
 
	private void init(String name){
		try {
			br = new BufferedReader(new FileReader(name));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
 
	public String nextToken(){
		while(st == null || !st.hasMoreElements()){
			try {
				st = new StringTokenizer(br.readLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return st.nextToken();
	}
 
	public int nextInt(){
		return Integer.parseInt(nextToken());
	}
 
	public long nextLong(){
		return Long.parseLong(nextToken());
	}
 
	public double nextDouble(){
		return Double.parseDouble(nextToken());
	}
 
}

Примеры использования
Объявление FastScanner’а для чтения из консоли:

FastScanner scan = new FastScanner();

Объявление FastScanner’а для чтения из указанного файла:

FastScanner scan = new FastScanner("A.in");

Объявление FastScanner’а для чтения из консоли или из файла input.txt
в зависимости от установленного свойства ONLINE_JUDGE

FastScanner scan = new FastScanner(true);

Чтение данных:

int i = scan.nextInt();
long l = scan.nextLong();
double d = scan.nextDouble();
String token = scan.nextToken();

Быстрый вывод в консоль
Наряду с быстрым чтением входных данных, также важен быстрый вывод данных в консоль. Для ускорения вывода будем не сразу выводить данные в консоль с помощью System.out, а с помощью PrintWriter будем накапливать, и лишь потом сбрасывать данные в консоль командой flush (что эффективнее). Сбрасывать данные лучше порциями среднего размера, чтобы соблюсти баланс между скорость и потребляемой памятью.

PrintWriter out = new PrintWriter(System.out);
out.println(result);
out.flush();

Сравним вывод одинаковых данных через обычный System.out и через PrintWriter.
Код ниже у меня отработал примерно за 2 секунды:

for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
        System.out.println(i * j);
    }
}

А следующий код с буферизацией отработал существенно быстрее, за менее чем 0,7 секунды:

PrintWriter out = new PrintWriter(System.out);
for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
        out.println(i * j);
    }
    out.flush();
}

Заготовка HTML-страницы

Заготовка HTML-страницы с указание кодировки UTF-8, подключенным файлом стилей и скриптом:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Заголовок</title>		
<link rel="stylesheet" type="text/css" href="style.css" />
<script src="script.js"></script>
</head>
<body>
 
</body>
</html>

Команды для изучения нового Linux-сервера

Очень часто требуется настроить сервер, который вы видите в первые, а настраивали его до вас. С Windows-серверами проблем мало, а вот с Linux-серверами настройка может затянуться, если вы не знаете необходимых команд. Ниже будет приведен список самых необходимых команд.

  1. Узнать какой перед нами Linux и его версия

    cat /etc/issue
  2. Просмотреть историю последних выполненных команд

    history
  3. Узнать кол-во свободного места в файловой системе

    df -h

    Опция -h показывает данные в килобайтах, мегабайтах и гигабайтах

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

    fdisk -l
  5. Вывести информацию о состоянии всех активных сетевых интерфейсах:

    ifconfig
  6. Перезагрузка сервера

    reboot
  7. Выключить сервер

    shutdown -h 0
  8. Распаковка tar-архива сжатого gzip’ом

    tar xvfz archive.tar.gz
  9. Распаковка tar-архива сжатого bzip’ом

    tar xvfj archive.tar.bz2
  10. Перемещение файла (директории)

    mv from_file to_file

Unable to execute dex: java.nio.BufferOverflowException

Снова при запуске импортированного приложения повторилась следующая ошибка:

[2014-05-09 23:36:21 - Dex Loader] Unable to execute dex: java.nio.BufferOverflowException. 
Check the Eclipse log for stack trace.
[2014-05-09 23:36:21 - HelloJni] Conversion to Dalvik format failed: 
Unable to execute dex: java.nio.BufferOverflowException. 
Check the Eclipse log for stack trace.

И снова решение проблемы плохо гуглиться: в основном предлагают откатить или обновить версию SDK. После гугления вспомнил, как решается проблема.
Нужно чтобы целевая версия SDK совпадала в манифесте приложения (AndroidManifest.xml) и в свойствах проекта (project.properties)
Например, в представленных ниже фрагментах указана 19-я версия SDK.
AndroidManifest.xml:

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

project.properties:

# Project target.
target=android-19