Поиск по этому блогу

понедельник, 7 сентября 2015 г.

Java. Как найти наибольшее и наименьшее число

Найти наибольшее и наименьшее число из группы в Java можно при помощи методов из классов
import java.util.Arrays;
import java.util.Collections;

Вот эти методы
Arrays.asList(T... a)
Collections.max(Collection col)
Collections.min(Collection col)

public static <T> List<T> asList(T... a)
 
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
 
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)

Пример

int largest = Collections.max(Arrays.asList(num1, num2, num3, num4, num5));
int smallest = Collections.min(Arrays.asList(num1, num2, num3, num4, num5));
 
System.out.printf("largest number is %d%n", largest);
System.out.printf("smallest number is %d%n", smallest);

Java. Найти наименьшее и наибольшее число из 3

Наиболее быстрый и оптимальный способ найти наименьшее или наибольшее число из трех можно с помощью методов класса Math
public static int min(int a, int b, int c) {
  return Math.min(Math.min(a, b), c);
}
 
public static int max(int a, int b, int c) {
  return Math.max(Math.max(a, b), c);
}

Источники

http://stackoverflow.com/questions/9576557/most-efficient-way-to-find-smallest-of-3-numbers-java

вторник, 25 августа 2015 г.

CSS. Стиль для Placeholder

При помощи CSS возможно стилизовать атрибут placeholder так как нам нужно. Делается это следующим образом.
::-webkit-input-placeholder {
   color: red;
}
 
:-moz-placeholder { /* Firefox 18- */
   color: red;  
}
 
::-moz-placeholder {  /* Firefox 19+ */
   color: red;  
}
 
:-ms-input-placeholder {  
   color: red;  
}


Допустим у нас имеется текстовое поле ввода.

<input type="text" placeholder="Оставьте сообщение здесь">


Создадим для него класс который будет стилизовать placeholder.
title-not-input {
   input[type="text"]::-webkit-input-placeholder {
       color: #D5193B;   }
   input[type="text"]:-moz-placeholder { color: #D5193B; }
   input[type="text"]::-moz-placeholder { color: #D5193B; }
   input[type="text"]:-ms-input-placeholder { color: #D5193B; }
   input[type="text"] { 
      font-family: "Gotham Light";      
      font-size: 26pt;      
      letter-spacing: 1.3pt;   }
}

Изменять можно следующие свойства placeholder
  • font (и сопутствующие свойства)
  • background (и сопутствующие свойства)
  • color
  • word-spacing
  • letter-spacing
  • text-decoration
  • vertical-align
  • text-transform
  • line-height
  • text-indent
  • text-overflow
  • opacity

Источники

  1. https://css-tricks.com/snippets/css/style-placeholder-text/
  2. http://html5.by/blog/placeholder/
  3. http://stackoverflow.com/questions/2610497/change-an-inputs-html5-placeholder-color-with-css
  4. http://htmlbook.ru/css/-webkit-input-placeholder












jQuery Mobile center popup on show

Для того чтобы разместить POPUP при появлении точно по центру экрана можно обрабатывать событие POPUPAFTEROPEN. В нем считать отступы сверху и слева и задавать их для POPUP.

$('#popupMenu').on('popupafteropen', function () {
    var centerX = ($(document).width() - $('.ui-popup-container').width())/2;
    var centerY = ($(document).height() - $('.ui-popup-container').height())/2;
      $('.ui-popup-container').css({
        top: centerY,
        left: centerX
    });
});

CSS Show div on center

Выровнять DIV по середине экрана возможно различными методами как при помощи CSS так и при помощи jQuery.

При помощи jQuery 

   jQuery.fn.center = function () {
    this.css("position","absolute");
    this.css("top", (jQuery(window).height()-this.height())/2+jQuery(window).scrollTop()+"px");
    this.css("left", (jQuery(window).width()-this.width())/2+jQuery(window).scrollLeft()+"px");
    return this;

При помощи CSS

.center {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 48%;
  height: 59%;
}

Чтобы работало на iOS

Для того чтобы работало в iOS устройствах необходимо добавить следующие строчки.
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);

Конечный вариант CSS
.center {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  width: 48%;
  height: 59%;
}

Источники

1. http://stackoverflow.com/questions/27303339/transform-not-working-on-ios

jQuery handle div show/hide

Как обработать перехват появления или скрытия элемента. Для того чтобы показать/скрыть элемент используются методы show/hide. В этот метод можно передать два параметра - второй из них это обработчик (callback/handler) вызова метода. В нем мы можем сделать все необходимое нам при появлении или скрытии элемента. 

JavaScript Version

$('#show').click(function() {
    $('#myDiv').show(0, onDivShow);
});
 
$('#hide').click(function() {
    $('#myDiv').hide(0, onDivHide);
});
 
 
function onDivShow() { alert('is shown'); }
function onDivHide() { alert('is hidden'); }

CoffeeScript Version

$('#cancelBtn').on 'click', () =>
    $('#dialogPage1').show(0, () =>
     @onDivShow()
     return
    )
 
onDivShow: () =>
    centerX = ($(document).width() - $('.ui-popup-container').width())/2
    centerY = ($(document).height() - $('.ui-popup-container').height())/2
    $('.ui-popup-container').css
        top: centerY
        left: centerX
    return

jQuery programming scroll in GWT

Программно прокрутить скрол до нужного элемента можно при помощи jQuery следующим образом. Нужно использовать метод animate() и метод scrollTop() в нем. Параметр 2000 задержка - это анимация. Если он равен 0, то прокрутка происходит мгновенно.

$("#button").click(function() {
    $('html, body').animate({
        scrollTop: $("#elementtoScrollToID").offset().top
    }, 2000);
});

Как это реализовать в GWT.

private native void jQueryScrollCalendar(elementId) /*-{
  $wnd.jQuery("#scrollContainer").animate({
   scrollTop: $wnd.jQuery("#" + elementId).offset().top}, 0);
 }-*/;
 


Источники 

1. http://stackoverflow.com/questions/6677035/jquery-scroll-to-element

Guava Lists.partition + gae objectify

Загружать данные из datastore при помощи objectify можно группами(то есть по частям). Для этого можно использовать средства из библиотеке Guava. Это метод Lists.partition, в который передаем два параметра - список ключей и количество элементов в группе (например 25).

for (List<String> list : Lists.partition(new ArrayList<>(ids), 25))

 Подготовленный лист с ключами передаем в метод ids и получаем список значений.

result.addAll(ofy().load().type(UserEntity.class).ids(list).values());


public List<UserEntity> getUserEntities(Collection<Long> userIds, Long systemId) {
    List<UserEntity> result = new ArrayList<>();
    if (userIds == null) {
      return result;
    }
    List<String> ids = new ArrayList<>();
    for (Long id : userIds) {
      ids.add(UserEntity.generateKey(systemId, id));
    }
    for (List<String> list : Lists.partition(new ArrayList<>(ids), 25)) {
      result.addAll(ofy().load().type(UserEntity.class).ids(list).values());
    }
    return result;
 }





jQuery get scroll position - scrollTop()


Для того,  чтобы узнать величину отступа прокрутки от верхней границы необходимо использовать метод scrollTop(). Этим же методом можно и задать значение отступа прокрутки, передав туда параметр - scrollTop(value).
В GWT для использования jQuery нужно писать $wnd.jQuery вместо $.

@Overridepublic void setCurrentScrollPosition() {
    currentScrollPosition = getCurrentScrollPosition();
}
 
private native int getCurrentScrollPosition() /*-{   
    return $wnd.jQuery("#scrollContainer").scrollTop(); }-*/;
 
@Overridepublic void scrollCalendar() {
    if (currentScrollPosition > 0) {
        jQueryScrollCalendar(currentScrollPosition);   
    }
}
 
private native void jQueryScrollCalendar(int position) /*-{   
    $wnd.jQuery("#scrollContainer").animate({scrollTop: position}, 0);}-*/;

Источники

понедельник, 29 июня 2015 г.

Phonegap prompt. How to set input type.

В HTML для обычного поля ввода задать, данные какого типа туда можно вводить, очень просто - достаточно задать атрибут "type".

Для ввода чисел
<input type="number" name="numberTextfield"/>

Для ввода телефона
<input type="tel" name="phoneTextfield"/>

Это же прекрасно работает и в Phonegap. Появляются соответствующие клавиатуры для ввода.

А вот как задать тип клавиатуры для поля ввода, которое будет в диалоге Prompt?

Вот документация по соответствующему плагину.
http://docs.phonegap.com/en/edge/cordova_notification_notification.md.html

navigator.notification.prompt(message, promptCallback, [title], [buttonLabels], [defaultText])
Эта функция позволяет нам показывать более кастомный dislog box. Можно задать многое - callback, заголовок, текст по умолчанию и даже текст на кнопках. Но нельзя задать тип клавиатуры.

Пример использования
// Show a custom prompt dialog
function showPrompt() {
    navigator.notification.prompt(
        'Please enter your name',  // message
        onPrompt,                  // callback to invoke
        'Registration',            // title
        ['Ok','Exit']              // buttonLabels
    );
}

Еще пример со встроенным callback
window.navigator.notification.prompt(
    new String(), // message
    function(answer) {
        if (answer.buttonIndex === 1) {
            // Ok
            var newcat = answer.input1;
            transaction.executeSql("INSERT INTO cat (Name) VALUES (?)", [newcat]);
        }
        else {
            // Exit
        }
    }, // callback
    "ADD CATEGORY", //title
    ["Ok", "Exit"], // button titles
    new String() // defaultText
);

Для того чтобы его настроить нам придется лезть в исходный код плагина и дополнять его.
plugins/CDVNotification.m

Нас интересует метод
- (void)prompt:(CDVInvokedUrlCommand*)command
{
    NSString* callbackId = command.callbackId;
    NSString* message = [command argumentAtIndex:0];
    NSString* title = [command argumentAtIndex:1];
    NSArray* buttons = [command argumentAtIndex:2];
    NSString* defaultText = [command argumentAtIndex:3];
 
    [self showDialogWithMessage:message title:title 
    buttons:buttons defaultText:defaultText 
    callbackId:callbackId dialogType:DIALOG_TYPE_PROMPT];
}

В нем вызывается другой метод
    title:(NSString*)title buttons:(NSArray*)buttons 
    defaultText:(NSString*)defaultText 
    callbackId:(NSString*)callbackId dialogType:(NSString*)dialogType {
 
CDVAlertView* alertView = [[CDVAlertView alloc]
    initWithTitle:title
              message:message
             delegate:self
    cancelButtonTitle:nil
    otherButtonTitles:nil];
 
alertView.callback
 
Id = callbackId;
 
    int count = [buttons count];
 
    for (int n = 0; n < count; n++) {
        [alertView addButtonWithTitle:[buttons objectAtIndex:n]];
    }
 
    if ([dialogType isEqualToString:DIALOG_TYPE_PROMPT]) {
        UITextField* textField = [alertView textFieldAtIndex:0];
        textField.text = defaultText;
    }
 
    [alertView show];
}

Нам нужно задать полю ввода тип клавиатуры.
[textField setKeyboardType:UIKeyboardTypeNamePhonePad];

Все возможные типы клавиатур
typedef enum {
    UIKeyboardTypeDefault,                // Default type for the current input method.
    UIKeyboardTypeASCIICapable,           // Displays a keyboard which can enter ASCII characters, non-ASCII keyboards remain active
    UIKeyboardTypeNumbersAndPunctuation,  // Numbers and assorted punctuation.
    UIKeyboardTypeURL,                    // A type optimized for URL entry (shows . / .com prominently).
    UIKeyboardTypeNumberPad,              // A number pad (0-9). Suitable for PIN entry.
    UIKeyboardTypePhonePad,               // A phone pad (1-9, *, 0, #, with letters under the numbers).
    UIKeyboardTypeNamePhonePad,           // A type optimized for entering a person's name or phone number.
    UIKeyboardTypeEmailAddress,           // A type optimized for multiple email address entry (shows space @ . prominently).
    UIKeyboardTypeDecimalPad,             // A number pad including a decimal point
    UIKeyboardTypeTwitter,                // Optimized for entering Twitter messages (shows # and @)
    UIKeyboardTypeWebSearch,              // Optimized for URL and search term entry (shows space and .)
 
    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, // Deprecated
 
} UIKeyboardType;


воскресенье, 28 июня 2015 г.

How to execute task in Google App Engine

Запускать задачи на выполнение в Google App Engine можно следующим образом

Получаем дефолтную очередь задач и добавляем в нее нашу задачу.
Inline анонимный класс, который реализует интерфейс DeferredTask - это задача, которая будет выполнятся.

import com.google.appengine.api.taskqueue.DeferredTask;
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
 
...
 
Queue queue = QueueFactory.getDefaultQueue();
queue.add(TaskOptions.Builder.withPayload(new DeferredTask() {
    @Override
    public void run() {
 
    }
}));

Можно вынести задачу в отдельный класс, в случае если она используется в нескольких местах.

import com.google.appengine.api.taskqueue.DeferredTask;
 
public class ExampleTask implements DeferredTask {
 
    public ExampleTask(String param1, String param2) {
 
    }
 
    @Override
    public void run() {
    }
}

Queue queue = QueueFactory.getDefaultQueue();
queue.add(TaskOptions.Builder.withPayload(new ExampleTask(param1, param2)));

среда, 20 мая 2015 г.

Как удалить все пробелы у всех элементов массива


Исходная строка с пробелами
String [] array = {" Beer", "Old Whiskey "," Vodka "}
for (int i = 0; i < array.length; i++)
    array[i] = array[i].trim();

Рузультат
{"Beer", "Old Whiskey", "Vodka"}

Java Core. Ключевое слово transient

Ключевое слово transient предназначено для того, чтобы обозначить, что поле, перед которым написано это слово, не будет сериализовано.
class DeviceInfo implements Serializable{
    private String name;
    private transient String description;
    private String article;
 
...
}

Для того чтобы понимать назначение слова transient необходимо понимать, что такое сериализация и зачем она нужна.

Что такое сериализация


Сериализация - это процесс, при котором состояние объекта становится постоянным (persistent state), то есть процесс сохранения состояния объекта в какое либо хранилище, например, в базу данных. Это означает, что состояние объекта преобразуется в поток байтов и хранится в файле. Таким же образом мы можем использовать десериализацию - вернуть состояние объекта из потока байтов. Это одно из важнейших понятий в Java программировании, потому что сериализация широко используется в web-программировании. Объекты, которые должны быть переданы через сеть должны быть преобразованы в байты. Для этой цели каждый класс или интерфейс должны реализовывать интерфейс Serializable. Это интерфейс-маркер без каких-либо методов.

Зачем это нужно и когда использовать


По умолчанию, все переменные объекта преобразуются в постоянное состояние (persistent state). В некоторых случаях, вы можете хотеть не сохранять некоторые переменные, потому что нет необходимости сохранять эти переменные. Таким образом, вы можете объявить эти переменные как transient. Если переменная объявлена как transient, то она не будет сохранена. Это и есть основная цель ключевого слова transient.

Пример использования


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
 
class DeviceInfo implements Serializable {
    private String name;
    private transient String description;
    private String article;
 
    public DeviceInfo(String name, String description, String article) {
      this.name = name;
      this.description = description;
      this.article = article;
    }
 
    @Override
    public String toString() {
      StringBuffer sb = new StringBuffer(40);
      sb.append("Name : ");
      sb.append(this.name + "\n");
      sb.append("Description : ");
      sb.append(this.description + "\n");
      sb.append("Article : ");
      sb.append(this.article + "\n");
      return sb.toString();
    }
}
 
public class TransientTest {
 
    public static void main(String[] args) throws Exception {
      // создаем объект
      DeviceInfo deviceInfo = new DeviceInfo("Iphone 6", "Very luxury device", "A1644");
 
      // сериализуем объект
      ObjectOutputStream o = new ObjectOutputStream(new FileOutputStream("store"));
      o.writeObject(deviceInfo);
      o.close();
 
      // десериализуем объект
      ObjectInputStream in = new ObjectInputStream(new FileInputStream("store"));
      DeviceInfo deviceInfo1 = (DeviceInfo) in.readObject();
      System.out.println(deviceInfo1);
 
    }
 
}

Результат

Name : Iphone 6
Description : null
Article : A1644

Поле description объявлено как transient, поэтому оно не будет сохранятся в хранилище объектов.

Источники


http://stackoverflow.com/questions/5245600/what-does-the-keyword-transient-mean-in-java

http://stackoverflow.com/questions/20700530/why-use-transient-keyword-in-java

http://stackoverflow.com/questions/910374/why-does-java-have-transient-variables

http://jdevnotes.blogspot.ru/2011/05/transient.html

http://forum.vingrad.ru/forum/topic-123949/0.html

http://j4sq.blogspot.ru/2012/01/java-2-middle.html

вторник, 19 мая 2015 г.

Java Core. Splitting string with pipe character (“|”)

Разделение строки на подстроки при помощи символа "|"


Как разделить строку на подстроки, если в исходной строке слова разделены с помощью символа "|".

Исходная строка
String str = "with | great | power | comes | great | responsibility";

Символ | является метасимволом в регулярных выражениях, поэтому при использовании его для как разделителя в строке нам необходимо его экранировать
String[]values = str.split("\\|");

Всего существует 4 способа разделить строку на подстроки:
1. Метод split(String regex) в классе String
String[]values = str.split("\\|");
System.out.println(Arrays.toString(values));

2. Метод Pattern.quote
values = str.split(Pattern.quote("|"));
System.out.println(Arrays.toString(values));

3. Метод Pattern.compile
values = Pattern.compile("\\|").split(str);
System.out.println(Arrays.toString(values));

4. Класс StringTokenizer
// Split using StringTokenizer class
StringTokenizer tokenizer = new StringTokenizer(str, "|");
ArrayList<String> list = new ArrayList<String>(str.length());
while(tokenizer.hasMoreTokens()) {
           list.add(tokenizer.nextToken());
}
System.out.println(list); 


Весь код


import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
 
 
public class TestA {
 
    public static void main(String[] args) {
 
 String str = "with | great | power | comes | great | responsibility";
 
 // Simple split method
 String[]values = str.split("\\|");
 System.out.println(Arrays.toString(values));
 
 // Split using Pattern.quote method
 values = str.split(Pattern.quote("|"));
 System.out.println(Arrays.toString(values));
 
 // Split using Pattern.compile method
 values = Pattern.compile("\\|").split(str);
 System.out.println(Arrays.toString(values));
 
 // Split using StringTokenizer class
 StringTokenizer tokenizer = new StringTokenizer(str, "|");
 ArrayList<String> list = new ArrayList<String>(str.length());
 while(tokenizer.hasMoreTokens()) {
            list.add(tokenizer.nextToken());
 }
 System.out.println(list); 
 
    }
 
}


Результаты



Источники


http://stackoverflow.com/questions/10796160/splitting-a-java-string-by-the-pipe-symbol-using-split

http://stackoverflow.com/questions/21524642/splitting-string-with-pipe-character