Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленькие классы, Помощники 
:(
    Опции темы
Platon
Дата 12.8.2008, 19:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 16
Всего: 40



я думаю, нам еще лучше подойдет вариант:
Код

from + ran.nextInt(to - from)

PM MAIL ICQ   Вверх
Hades
Дата 12.8.2008, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



Platon,  smile 
PM MAIL   Вверх
sergejzr
Дата 13.8.2008, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Platon, действительно. smile какой-то индийский цикл получился. Даже не знаю, как он туда закрался smile)


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Hades
Дата 13.8.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



sergejzr
может стоит изменить и
Цитата(sergejzr @  6.1.2006,  15:38 Найти цитируемый пост)

Код

// ...
switch(Math.abs(ran.nextInt()) % 3)        
// ...
pass+=(char)((Math.abs(ran.nextInt()) % range)+next);
// ...


на
Код

// ...
switch(ran.nextInt(3))        
// ...
pass+=(char)(ran.nextInt(range) + next);
// ...


PM MAIL   Вверх
gelo86
Дата 17.10.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Мы ушли от ночалной идейи - java util framework. Как думаете, многоби билоби желающих просматривать код такого проекта, коментироват: где код плохой, где его и как можна улудшить, предлагать свайи методы и даже классы.
У меня есть желание чтото такого создать. Толко разумеется создоват для себя и аднаму просто глупо, но если билоби народу, каторий исползует и предлагает чтото нового, то билоби разумно чтото создать.
PM MAIL   Вверх
batigoal
Дата 17.10.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(gelo86 @  17.10.2008,  13:06 Найти цитируемый пост)
Толко разумеется создоват для себя и аднаму просто глупо, но если билоби народу, каторий исползует и предлагает чтото нового, то билоби разумно чтото создать. 

А по-другому и не получится. Если нет энтузиаста, который все тянет на себе, то проект захлебывается (тем более некоммерческий).


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
gelo86
Дата 17.10.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 388
Регистрация: 26.10.2007

Репутация: нет
Всего: нет



Поетому и спрашиваю. Сколко билоби одномисленников?
PM MAIL   Вверх
illarion
Дата 5.3.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.2.2009

Репутация: нет
Всего: нет



Название: Конфигуратор на основе Properties
Тип: пример класса
Язык: Java
Версия JDK: 1.6
Требуемые библиотеки: нет
Автор: Illarion

1. Описание класса(ов)

Пример предназначен для быстрого создания загрузчика файлов конфигураций, привожу только текст конструктора класса, который умеет заполнять свои поля на основе файла properties. Основная идея в  том, что вы создаете класс Config, в нем сколь угодно много поле (String и int), каких вам надо, с модификатором доступа public. А их значения выносите в файл пропертей, с такими же точно именами. После чего вызываете нижеописаный конструктор, он сам все заполнит.

 Зависимость от стандартных пропертей я убрал т.к. они ненормально поддерживают юникод - там приходится экранировать символы. 
2. Код properties (для примера)

Код

server=ya.ru
port=80
login=test_user


3. Код класса

Код

import java.io.BufferedReader;

public class Config {

/* Эти поля следует заменить на свои */

    public String server;
    public int port;
    public String login;

    public Config(String fileName) throws Exception {

        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        String line = "";

        Field[] fieldsArray = this.getClass().getFields();
        Map<String, Field> fields = new HashMap<String, Field>();

        for (Field field : fieldsArray) {
            fields.put(field.getName(), field);
        }

        while (true) {
            line = reader.readLine();
            

            if (line == null) {
                break;
            }

            if (line.startsWith("#")) {
                continue;
            }

            if (!line.contains("=")) {
                continue;
            }

            String[] strings = line.split("=",2);

            if (strings.length < 2) {
                continue;
            }

            String key = strings[0];
            String valueString = strings[1];

            if (!fields.containsKey(key)) {
                continue;
            }

            Field field = fields.get(key);

            Object valueObject = valueString;

            if (field.getType().equals(int.class)) {
                valueObject = Integer.parseInt(valueString);
            }

            field.set(this, valueObject);

        }

    }
}




Это сообщение отредактировал(а) illarion - 5.3.2009, 11:02
PM MAIL   Вверх
aliks
Дата 10.4.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 146
Регистрация: 17.12.2008

Репутация: 1
Всего: 1



Как просили меня в теме которую я создал, перенести исходник который я выложил, в эту тему:

Преобразование чисел (денег) в пропись
Исходный код где то встретил в инет, там автор предлагал работать совместно с SQL (правдо непонятно зачем??? - лишние запросы)
Мной код немного доработан и улучшен, предлагаю для всех, кому необходим

Код

package AW.Common;
import java.math.*;
/**
 * Преобразование суммы цифрами в сумму прописьь
 * @author Aleksey Osipov
 * e-mal: [email protected]
 */
public class jAmount {
    private static class jAmCurrency {
        public CurrencyParam curParam;
        public class CurrencyParam {
            short ID_cur;
            String ISO_name;
            String Full_name;
            String i1;
            String i24;
            String i5;
            String r1;
            String r24;
            String r5;
            String Sex;
        }
        public jAmCurrency(Integer ID_Curr) {
            CurrencyParam[] Curr = new CurrencyParam[4];
            //---
            Curr[0] = new CurrencyParam();
            Curr[0].ID_cur    = 0;
            Curr[0].ISO_name  = "RUR";
            Curr[0].Full_name = "Российские рубли";
            Curr[0].i1        = "рубль";
            Curr[0].i24       = "рубля";
            Curr[0].i5        = "рублей";
            Curr[0].r1        = "копейка";
            Curr[0].r24       = "копейки";
            Curr[0].r5        = "копеек";
            Curr[0].Sex       = "M";
            //---
            Curr[1] = new CurrencyParam();
            Curr[1].ID_cur    = 1;
            Curr[1].ISO_name  = "UAH";
            Curr[1].Full_name = "Украинские гривны";
            Curr[1].i1        = "гривна";
            Curr[1].i24       = "гривны";
            Curr[1].i5        = "гривен";
            Curr[1].r1        = "копейка";
            Curr[1].r24       = "копейки";
            Curr[1].r5        = "копеек";
            Curr[1].Sex       = "F";
            //---
            Curr[2] = new CurrencyParam();
            Curr[2].ID_cur    = 2;
            Curr[2].ISO_name  = "USD";
            Curr[2].Full_name = "Доллары США";
            Curr[2].i1        = "доллар";
            Curr[2].i24       = "доллара";
            Curr[2].i5        = "долларов";
            Curr[2].r1        = "цент";
            Curr[2].r24       = "цента";
            Curr[2].r5        = "центов";
            Curr[2].Sex       = "M";
            //---
            Curr[3] = new CurrencyParam();
            Curr[3].ID_cur    = 3;
            Curr[3].ISO_name  = "EUR";
            Curr[3].Full_name = "Евро";
            Curr[3].i1        = "евро";
            Curr[3].i24       = "евро";
            Curr[3].i5        = "евро";
            Curr[3].r1        = "цент";
            Curr[3].r24       = "цента";
            Curr[3].r5        = "центов";
            Curr[3].Sex       = "M";
            curParam = Curr[ID_Curr];
        }
    }
    private BigInteger summ;
    private static final BigInteger zero     = new BigInteger ("0");
    private static final BigInteger hundred  = new BigInteger ("100");
    private static final BigInteger thousand = new BigInteger ("1000");
    private final jAmCurrency.CurrencyParam curParam;
    // Конструктор класса
    public jAmount (int Currency, String s) {
        curParam = new jAmCurrency(Currency).curParam;
        s=s.replaceAll(",", ".");
        try {
            BigDecimal decimal = new BigDecimal (s);
            // Преобразуем в копейки (центы, пфенниги и т.д.),
            // одним словом - убираем дробную часть
            decimal = decimal.multiply (new BigDecimal (100.00));
            summ = decimal.toBigInteger ();
            // Приступить к преобразованию
            toString ();
        }
        catch (NumberFormatException e) {
            // Ой !!!!! Что-то не так: скорее всего, в строке
            // представляющей собой сумму цифрами, встретились символы
            // отличные от цифр и точки. Можно просто выводить сообщение
            // об ошибках на консоль:
            System.out.println(e);
            System.out.println("Ошибка преобразование суммы");
        }
    }
    // Получить правую (дробную) часть суммы
    public String getRightPart () {
        return alignSumm (summ.remainder (hundred).abs ().toString ());
    }
    // Если сумма меньше 10, то выровнять ее дописыванием "0"
    String alignSumm (String s) {
        switch (s.length ()) {
            case 0: s = "00"; break;
            case 1: s = "0" + s; break;
        }
        return s;
    }
    @Override
    public String toString () {
        StringBuffer result = new StringBuffer ();
        BigInteger [] divrem = summ.divideAndRemainder (hundred);
        if (divrem [0].signum () == 0) result.append ("Ноль ");
        divrem = divrem [0].divideAndRemainder (thousand);
        BigInteger quotient  = divrem [0];
        BigInteger remainder = divrem [1];
        int group = 0;
        do {
           int value = remainder.intValue ();
           result.insert (0, groupToString (value, group));
           // Для нулевой группы добавим в конец соответствующую валюту
           if (group == 0) {
               int rank10 = (value % 100) / 10;
               int rank = value % 10;
               if (rank10 == 1) {
                   result = result.append (curParam.i5);
               }
               else {
                    switch (rank) {
                    case 1: result = result.append (curParam.i1); break;
                    case 2:
                    case 3:
                    case 4: result = result.append (curParam.i24); break;
                   default: result = result.append (curParam.i5); break;
                    }
               }
           }
           divrem = quotient.divideAndRemainder (thousand);
           quotient  = divrem [0];
           remainder = divrem [1];
           group++;
        }
        while (!quotient.equals (zero) || !remainder.equals (zero));
        // Дробная часть суммы
        String s = getRightPart ();
        result = result.append (" ").append (s);
        result = result.append (" ");
        if (s.charAt (0) == '1') {
            result = result.append (curParam.r5);
        }
        else {
             switch (s.charAt(1)) {
             case '1': result = result.append (curParam.r1); break;
             case '2':
             case '3':
             case '4': result = result.append (curParam.r24); break;
             default:  result = result.append (curParam.r5); break;
            }
        }
        // По правилам бухгалтерского учета первая буква строкового
        // представления должна быть в верхнем регистре
        result.setCharAt (0, Character.toUpperCase (result.charAt (0)));
        return result.toString();
    }
    // Преобразование группы цифр в строку
    String groupToString (int value, int group) {
        if (value < 0 || value > 999) throw new IllegalArgumentException ("value must be between 0 an 999 inclusively");
        if (group < 0) throw new IllegalArgumentException ("group must be more than 0");
        StringBuffer result = new StringBuffer (32);
        if (value == 0) {
            return result.toString();
        }
        // Разбор числа по разрядам, начиная с сотен
        int rank = value / 100;
        switch (rank) {
        default: break;
        case 1:  result = result.append ("сто ");       break;
        case 2:  result = result.append ("двести ");    break;
        case 3:  result = result.append ("триста ");    break;
        case 4:  result = result.append ("четыреста "); break;
        case 5:  result = result.append ("пятьсот ");   break;
        case 6:  result = result.append ("шестьсот ");  break;
        case 7:  result = result.append ("семьсот ");   break;
        case 8:  result = result.append ("восемьсот "); break;
        case 9:  result = result.append ("девятьсот "); break;
        }
        // Далее, десятки
        rank = (value % 100) / 10;
        switch (rank) {
        default: break;
        case 2:  result = result.append ("двадцать ");    break;
        case 3:  result = result.append ("тридцать ");    break;
        case 4:  result = result.append ("сорок ");       break;
        case 5:  result = result.append ("пятьдесят ");   break;
        case 6:  result = result.append ("шестьдесят ");  break;
        case 7:  result = result.append ("семьдесят ");   break;
        case 8:  result = result.append ("восемьдесят "); break;
        case 9:  result = result.append ("девяносто ");   break;
        }
        // Если десятки = 1, добавить соответствующее значение. Иначе - единицы
        int rank10 = rank;
        rank = value % 10;
        if (rank10 == 1) {
            switch (rank) {
            case 0: result = result.append ("десять ");       break;
            case 1: result = result.append ("одиннадцать ");  break;
            case 2: result = result.append ("двенадцать ");   break;
            case 3: result = result.append ("тринадцать ");   break;
            case 4: result = result.append ("четырнадцать "); break;
            case 5: result = result.append ("пятнадцать ");   break;
            case 6: result = result.append ("шестнадцать ");  break;
            case 7: result = result.append ("семнадцать ");   break;
            case 8: result = result.append ("восемнадцать "); break;
            case 9: result = result.append ("девятнадцать "); break;
            }
        }
        else {
            switch (rank) {
            default:
                 break;
            case 1:
                 if (group == 1) // Тысячи
                     result = result.append ("одна ");
                 else {
                    // Учесть род валюты (поле "Sex" настроечной информации)
                    if (curParam.Sex.equals ("M")) result = result.append ("один ");
                    if (curParam.Sex.equals ("F")) result = result.append ("одна ");
                 }
                 break;
            case 2:
                 if (group == 1) // Тысячи
                     result = result.append ("две ");
                 else {
                    // Учесть род валюты (поле "Sex" настроечной информации)
                    if (curParam.Sex.equals ("M")) result = result.append ("два ");
                    if (curParam.Sex.equals ("F")) result = result.append ("две ");
                 }
                 break;
            case 3: result = result.append ("три ");    break;
            case 4: result = result.append ("четыре "); break;
            case 5: result = result.append ("пять ");   break;
            case 6: result = result.append ("шесть ");  break;
            case 7: result = result.append ("семь ");   break;
            case 8: result = result.append ("восемь "); break;
            case 9: result = result.append ("девять "); break;
            }
        }
        // Значение группы: тысячи, миллионы и т.д.
        switch (group) {
        default:
             break;
        case 1:
             if (rank10 == 1)
                 result = result.append ("тысяч ");
                else {
                switch (rank) {
                default: result = result.append ("тысяч ");  break;
                case 1:  result = result.append ("тысяча "); break;
                case 2:
                case 3:
                case 4:  result = result.append ("тысячи "); break;
                }
             }
             break;
        case 2:
             if (rank10 == 1)
                 result = result.append ("миллионов ");
             else {
                  switch (rank) {
                  default: result = result.append ("миллионов "); break;
                  case 1:  result = result.append ("миллион ");   break;
                  case 2:
                  case 3:
                  case 4:  result = result.append ("миллиона ");  break;
                  }
             }
             break;
        case 3:
             if (rank10 == 1)
                 result = result.append ("миллиардов ");
             else {
                  switch (rank) {
                  default: result = result.append ("миллиардов "); break;
                  case 1:  result = result.append ("миллиард ");   break;
                  case 2:
                  case 3:
                  case 4:  result = result.append ("миллиарда ");  break;
                  }
             }
            break;
        case 4:
             if (rank10 == 1)
                 result = result.append ("триллионов ");
             else {
                  switch (rank) {
                  default: result = result.append ("триллионов "); break;
                  case 1:  result = result.append ("триллион ");   break;
                  case 2:
                  case 3:
                  case 4:  result = result.append ("триллиона ");  break;
                  }
             }
             break;
        }
        return result.toString();
    }
  }


а вот так он вызывается

Код

String ss = new jAmount(0, "125.99");


Соответственно первый параметр это код валюты, а второй - необходимое число
Валюта:
0 - рубль
1 - гривна
2 - доллар
3 - евро 
--------------------
Любимая кнопка - F1, Любимое спасибо - Плюс в репутацию
PM MAIL Jabber   Вверх
powerOn
Дата 10.4.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(aliks @  10.4.2009,  14:48 Найти цитируемый пост)
jAmount


В Java хорошим тоном считается писать имена классов с большой буквы.  smile 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
CMYK
Дата 10.1.2010, 04:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 22.11.2008
Где: ЮГ

Репутация: нет
Всего: нет



У меня не один класс а несколько 
предназначено всё это для упрощения динамического генерирования регексов

в текст для регекса можно вставлять ну что то типа функций такого вида ${ANY_SYMBOL[0]} (см в использовании)  где ${...} контейнер для так называемой функции и ANY_SYMBOL[0] - сама функция можно в принципе создать файл который будет содержать имена лена вася и т.д. написать обработчик по образу и подобию как показано в использовании который будет считывать имена и вставлять их на место функции. Функцию можно сделать такого типа ${NAMES[имя_фала_с_именами.xml]}
дальше обработчик будет парсить xml ну и генерить регекс.
также есть метод protected dirtySpelling(String str) в классе AbstractBuilder который можно использовать в случаях когда необходимо найти правильно написанную фразу в тексте не очень хорошего качества где используются например в место буквы "о" - "0"(ноль) или английская буква "o" с остальными буквами аналигичная ситуация.

без вставок функций в текст просто генерируется регекс который игнорит знаки препинания например такую строку 'привет нихороший человек как дела'  найдет вот в такой строке 'какойто текст привет "нихороший человек" как. дела какойто текст' 
этот обработчик можно заменить на свой смотри класс RegexBuilder метод public void setNoFunctionBuilder(Builder newBuilder)

Да и сильно не пинайте на счет названий переменных и классов с английским у меня проблема да и с русскимsmile)))


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


Код


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegexBuilder {

      private static Pattern pattern1 = Pattern.compile("\\$\\{([^$]+)\\}");

      private static Pattern pattern2 = Pattern.compile("^(.*?)\\s*\\[(.*)]$");

      private static Pattern pattern3 = Pattern.compile("\\$SPLIT\\$");

      private Halper halper = new Halper();

      private Map<String, Builder> commands = new HashMap<String, Builder>();//мапа обработчиков

      public RegexBuilder() {
            commands.put("NO_FUNCTION", new DefaultNoFunctionBuilder());
      }

      public Pattern build(String string) {
            Pattern p = null;
            ArrayList<String> funct = new ArrayList<String>();
            ArrayList<String> flag = new ArrayList<String>();

            Matcher matcher = pattern1.matcher(string);
            boolean bol = false;

            while (matcher.find()) {
                  String func = matcher.group(1);
                  Matcher matcher2 = pattern2.matcher(func);
                  if (!matcher2.find()) {
                        throw new IllegalArgumentException("Invalid syntax");
                  }
                  String t = matcher2.group(1).trim();
                  if (!commands.containsKey(t)) {
                        throw new IllegalArgumentException("Invalid syntax");
                  }
                  flag.add(t);
                  funct.add(matcher2.group(2));
                  bol = true;
            }


            if (bol == true) {
                  string = pattern1.matcher(string).replaceAll("\\$SPLIT\\$");

                  string = halper.execute(string);

                  for (int i = 0; i < funct.size(); i++) {
                        string = pattern3.matcher(string).replaceFirst(process(flag.get(i), funct.get(i)));
                  }
                  p = Pattern.compile(string, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);

            } else {
                  p = Pattern.compile(process("NO_FUNCTION", string),
                                 Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
            }

            return p;
      }

      private String process(String function, String fo) {
            return commands.get(function).execute(fo);
      }

      public String dirtySpelling(String string) {
            return halper.spelling(string);
      }

      public boolean addBuilder(String functionName, Builder builder) {
            if (!commands.containsKey(functionName)) {
                  commands.put(functionName, builder);
                  return true;
            } else {
                  return false;
            }
      }

      public boolean setBuilder(String functionName, Builder newBuilder) {
            if (commands.containsKey(functionName)) {
                  commands.remove(functionName);
                  commands.put(functionName, newBuilder);
                  return true;
            } else {
                  return false;
            }
      }

      public boolean removeBuilder(String functionName) {
            if (commands.containsKey(functionName)) {
                  commands.remove(functionName);
                  return true;
            } else {
                  return false;
            }
      }

      public void setNoFunctionBuilder(Builder newBuilder) {
            commands.remove("NO_FUNCTION");
            commands.put("NO_FUNCTION", newBuilder);
      }

      public boolean containsFunctionName(String functionName) {
            return commands.containsKey(functionName);
      }

}



интерфейс обработчика

Код

public interface Builder {

      public String execute(String params);

}




этот просто сделал для того чтобы добавить функцианала немножко

Код

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public abstract class AbstractBuilder implements Builder {

      protected static final Pattern symbols = Pattern.compile("[^а-яa-z0-9]", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);

      protected static final Pattern space = Pattern.compile("\\s+");

      protected String dirtySpelling(String string) {
            String[] pat = {"[сc]", "[аa]", "[нh]", "[рp]", "[мm]", "[уy]", "[кk]", "[еe]", "[шщ]", "[хx]", "[ъь]", "[вb]", "[яr]", "[иn]", "[тt]", "[0oоq]", "[3з]"};
            ArrayList<Pattern> lists = new ArrayList<Pattern>();

            for (int i = 0; i < pat.length; i++) {
                  lists.add(Pattern.compile(pat[i], Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE));
            }

            for (int i = 0; i < pat.length; i++) {
                  string = lists.get(i).matcher(string).replaceAll(pat[i]);
            }

            return string;
      }

      protected String make(String sources) {
            Pattern numeral = Pattern.compile("^\\d+$");
            String[] split = sources.split(" ");
            for (int ii = 0; ii < split.length; ii++) {
                  split[ii] = dirtySpelling(split[ii]);

                  Matcher matcher = numeral.matcher(split[ii]);
                  if (ii != 0) {

                        if (matcher.find()) {
                              sources = sources + "(?:[0-9])*[^a-zа-я0-9]*";
                        } else {
                              sources = sources + "(?:\\b" + split[ii] + "\\b){1}[^a-zа-я0-9]*";
                        }

                  } else {

                        if (matcher.find()) {
                              sources = "[^a-zа-я0-9]*(?:[0-9])*[^a-zа-я0-9]*";
                        } else {
                              sources = "[^a-zа-я0-9]*(?:\\b" + split[ii] + "\\b){1}[^a-zа-я0-9]*";
                        }

                  }
            }
            return sources;
      }

      protected String normalize(String sources) {
            sources = symbols.matcher(sources).replaceAll(" ");
            sources = space.matcher(sources).replaceAll(" ");
            sources = sources.trim();
            return sources;
      }

}


дефолтный обработчик

Код

public class DefaultNoFunctionBuilder extends AbstractBuilder {

      public String execute(String sources) {
            sources = normalize(sources);
            return make(sources);
      }

}




класс хелпер

Код

import java.util.regex.Pattern;


public class Halper extends AbstractBuilder {

      private static final Pattern pattern1 = Pattern.compile("^\\$SPLIT\\$.+$");

      private static final Pattern pattern2 = Pattern.compile("^.+\\$SPLIT\\$$");

      private static final Pattern pattern3 = Pattern.compile("^\\$SPLIT\\$.+\\$SPLIT\\$$");

      private static final Pattern norm = Pattern.compile("[^\\$A-Za-zА-Яа-я0-9]");

      public String execute(String params) {
            String total = "";

            params = norm.matcher(params).replaceAll(" ");
            params = space.matcher(params).replaceAll(" ");

            if (pattern3.matcher(params).find()) {
                  total += proc2(params);
            } else {
                  if (pattern1.matcher(params).find()) {
                        total += proc3(params);
                  } else if (pattern2.matcher(params).find()) {
                        total += proc4(params);
                  } else {
                        total += proc(params);
                  }
            }

            return total;
      }

      private String proc(String params) {
            String total = "";
            String[] arr = params.split("\\$SPLIT\\$");

            String s = "";
            for (int i = 0; i < arr.length; i++) {
                  if ("".equalsIgnoreCase(total)) {
                        s = arr[i].trim();
                        if (!"".equalsIgnoreCase(s)) {
                              total += make(s);
                        }
                  } else {
                        s = arr[i].trim();
                        if (!"".equalsIgnoreCase(s)) {
                              total += "$SPLIT$" + make(s);
                        }
                  }
            }
            return total;
      }

      private String proc2(String params) {
            String total = "";
            String[] arr = params.split("\\$SPLIT\\$");

            String s = "";
            for (int i = 0; i < arr.length; i++) {
                  s = arr[i].trim();
                  if (!"".equalsIgnoreCase(s)) {
                        total += "$SPLIT$" + make(s);
                  }
            }
            total += "$SPLIT$";
            return total;
      }

      private String proc3(String params) {
            String total = "";
            String[] arr = params.split("\\$SPLIT\\$");

            String s = "";
            for (int i = 0; i < arr.length; i++) {
                  s = arr[i].trim();
                  if (!"".equalsIgnoreCase(s)) {
                        total += "$SPLIT$" + make(s);
                  }
            }
            return total;
      }

      private String proc4(String params) {
            String total = "";
            String[] arr = params.split("\\$SPLIT\\$");

            String s = "";
            for (int i = 0; i < arr.length; i++) {
                  if ("".equalsIgnoreCase(total)) {
                        s = arr[i].trim();
                        if (!"".equalsIgnoreCase(s)) {
                              total += make(s);
                        }
                  } else {
                        s = arr[i].trim();
                        if (!"".equalsIgnoreCase(s)) {
                              total += "$SPLIT$" + make(s);
                        }
                  }
            }
            total += "$SPLIT$";
            return total;
      }

      public String spelling(String string) {
            return dirtySpelling(string);
      }

      public String normal(String sources) {
            return normalize(sources);
      }

}


самый простейший способ использования 

Код

import java.util.regex.Matcher;
import java.util.regex.Pattern;




public class NewClass {

      private static final Pattern pattern = Pattern.compile("^[0-9]+$");

      public static void main(String[] s) {
            RegexBuilder rb = new RegexBuilder();
            rb.addBuilder("ANY_SYMBOL", new AbstractBuilder() {

                  public String execute(String params) {
                        String total = "";
                        Matcher matcher = pattern.matcher(params);
                        if (!matcher.find()) {
                              throw new IllegalArgumentException("Invalid syntax");
                        }

                        if ("0".equalsIgnoreCase(params)) {
                              total = ".*";
                        } else {
                              total = ".{0," + params + "}";
                        }

                        return total;
                  }

            });
            Pattern p = rb.build("привет ${ANY_SYMBOL[0]}как дела");
            System.out.println(p.toString());
      }

}


честно пытался сделать больше коментовsmile
PM MAIL   Вверх
AstRonin
Дата 2.8.2010, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 27.7.2010

Репутация: нет
Всего: нет



А обязательно код сюда выкладывать, или можно в code.google.com, а сюда просто ссылку?

на ихнем серваке удобно репозитарий создавать.
PM MAIL   Вверх
sergejzr
Дата 13.10.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Превращение значений SVM в вероятности с помощью правильно параметризованной sigmoid  функции. Можно так сказать, нормализация любого интервала в интервал [0,1]

По мотивам:
Probabilistic Outputs for Support Vector machines and Comparisions to Regularized Likelihood Methods
By: John C.Platt March 26 1999

Код

package normalisation;

/**
 * Java Implementation of the probabilistic output for SVM classifiers Described
 * in: Probabilistic Outputs for Support Vector machines and Comparisions to
 * Regularized Likelihood Methods By: John C.Platt March 26 1999
 * 
 * @author sergejzr
 * 
 */

public class PlattSigmoidNormalization {

    /**
     * 
     * @param out
     *            - array of SVM outputs
     * @param target
     *            - array of booleans: is ith example a positive example?
     * @param prior1
     *            - number of positive examples
     * @param prior0
     *            - number of negative examples
     * @return Sigmoid function which will map classifier outputs to a
     *         probability value [0,1]
     */
    public SigmoidFunction getSigmoid(double[] out, boolean[] target,
            int prior1, int prior0) {

        double A = 0;
        double B = Math.log((prior0 + 1) / (double) (prior1 + 1));
        double hiTarget = (prior1 + 1) / (double) (prior1 + 2);
        double loTarget = 1. / (prior0 + 2);
        double lambda = 0.00000000001;//Double.MIN_VALUE;
        double olderr = Double.MAX_VALUE;
        double[] pp = new double[out.length];

        setAll(pp, (prior1 + 1) / (double) (prior0 + prior1 + 2));

        int count = 0;
        for (int it = 0; it < 100; it++) {
            double a = 0, b = 0, c = 0, d = 0, e = 0;
            // First compute Hessian & gradient of error function
            for (int i = 0; i < target.length; i++) {
                double t = target[i] ? hiTarget : loTarget;
                double d1 = pp[i] - t;
                double d2 = pp[i] * (1 - pp[i]);
                a += out[i] * out[i] * d2;
                b += d2;
                c += out[i] * d2;
                d += out[i] * d1;
                e += d1;
            }
            // If gradient is really tiny, then stop
            if (Math.abs(d) < 0.0001 && Math.abs(e) < 0.0001) {
                break;
            }
            double oldA = A;
            double oldB = B;
            double err = 0.;
            // Loop until goodness of fit increases
            while (true) {
                double det = (a + lambda) * (b + lambda) - c * c;
                if (det == 0) {// If determinant of Hessian is zero
                    // increase stabilizer
                    lambda *= 10;
                    continue;
                }
                A = oldA + ((b + lambda) * d - c * e) / det;
                B = oldB + ((a + lambda) * e - c * d) / det;
                // Now compute the goodness of fit
                err = 0;
                for (int i = 0; i < out.length; i++) {
                    double t = target[i] ? hiTarget : loTarget; // ?
                    double p = 1. / (1 + Math.exp(out[i] * A + B));
                    pp[i] = p;
                    // At this step make sure the lod returnes -200
                    err -= t * Math.log(p) + (1 - t) * Math.log(1 - p);
                }
                if (err < olderr * (1 + Math.exp(-7))) {
                    lambda *= .1;
                    break;
                }
                // error did not decrease:increase stabilizer bx fsctor of 10
                // &try again
                lambda *= 10;
                if (lambda >= Math.exp(6)) // something is broken. Give up
                {
                    break;
                }
            }
            double diff = err - olderr;
            double scale = .5 * (err + olderr + 1);
            if (diff > -1 * Math.exp(-3) * scale && diff < Math.exp(-7) * scale) {
                count++;
            } else {
                count = 0;
            }
            olderr = err;
            if (count == 3) {
                break;
            }

        }
        return new SigmoidFunction(A, B);
    }

    /**
     * Simplified version
     * @param examples positive examples are greater 0, negative examples are smaller 0
     * @return
     */
    public SigmoidFunction getSigmoid(double[] examples)
    {
        boolean target[]=new boolean[examples.length];
        int prior1=0,prior0=0;
        for(int i=0;i<examples.length;i++)
        {
            target[i]=examples[i]>0;
            if(target[i])
            {
                prior1++;
            }else
            {
                prior0++;
            }
        }
        return getSigmoid(examples,target,prior1,prior0);
    }

    private void setAll(double[] PP, double d) {
        for (int i = 0; i < PP.length; i++) {
            PP[i] = d;
        }

    }

    public static void main(String[] args) {
        PlattSigmoidNormalization pn = new PlattSigmoidNormalization();

        
        
         SigmoidFunction sm = pn.getSigmoid(new double[] { -200, 5.6, 7.0 });
        print(sm, (-1));
        print(sm, (4));
        print(sm, (-3));
        print(sm, (5));
        print(sm, (-6));
        print(sm, (10));
        print(sm, (7));
        print(sm, (2));
        print(sm, (0.5));

    }

    private static void print(SigmoidFunction sm, double val) {
        double res = sm.getValue(val);
        System.out.println(val + "->" + res);

    }

    public SigmoidFunction getSigmoid(Double[] vals) {
        double hlp[]=new double[vals.length];
        
        for(int i=0;i<vals.length;i++)
        {
            hlp[i]=vals[i];
        }
        return getSigmoid(hlp);
    }
}



class SigmoidFunction {

    double A, B;

    public SigmoidFunction(double a, double b) {
        super();
        A = a;
        B = b;
    }

    public double getA() {
        return A;
    }

    public double getB() {
        return B;
    }

    public double getValue(double d) {
        return 1. / (1 + Math.exp(A * d + B));

    }

}



Может кому пригодится. В принципе эта бяка подойдёт для любого сценарии, где надо значения любого интервала преобразовать в интервал [0,1]. 
Смысл в том, что мы тренируем функцию с помощью нескольких значений - примеров и она уже в свою очередь любое значение поместит в интервал[0,1].


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
sergejzr
Дата 23.10.2010, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Выдаёт случайные не повторяющиеся значения из заданного интервала. Если у Вас очень большой массив, а вам надо случайным образом достать несколько не повторяющихся значений, то это для Вас. С помощью shuffle в принципе может сделать то же самое, но на больших массивах это будет довольно медленно.
Код

package classification;

import java.util.Random;
/**
 * Returns elements in random order.
 * Basically one could do this with "Collections.shuffle", 
 * however this one is more efficient as it avoids shuffling large collections
 * @author sergejzr
 *
 */
public class RandomLinear {
    int[] pool;
    int interval;
    Random r = new Random();
    private int min;

    public RandomLinear(int min, int max) {
        this.min=min;
        interval = max - min;
        pool = new int[interval];
        for (int i = 0; i < interval; pool[i] = i, i++)
            ;
    }
/**
 * Returnes the next random index from the pool. Will throw exception if no more elements are available
 * @return
 */
    public int nextRandom() {

        int ind = r.nextInt(interval);
        int ret = pool[ind];
        
        pool[ind] = pool[interval - 1];        
        interval--;
        
        return ret+min;
    }
    public static void main(String[] args) {
        
        String input[]=new String[]{"The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"};
        //Quickly shuffle the elements
        RandomLinear rs=new RandomLinear(0, input.length);
        
        for(int i=0;i<input.length;i++)
        {
            System.out.println(input[rs.nextRandom()]);
        }
        
    }
}




--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
leniviy
Дата 7.4.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Мне чем-то не понравились существующие реализации, поэтому сделал свой LoggerOutputStream 
Код

    /**
     * Stream sending data to the logger. Recognizes common line endings and
     * logs a message for each line. Incomplete lines are cached until EOL or
     * flush().
     * 
     */
    public class LoggerOutputStream extends ByteArrayOutputStream {
        CharsetDecoder decoder = Charset.defaultCharset().newDecoder();

        String prev = "";
        
        Level level;
        Logger log;
        
        public LoggerOutputStream(Logger log, Level level) {
            super();
            this.level = level;
            this.log = log;
        }
        
        void println(String s) {
            log.log(level, s);
        }

        static final String[] LSs = {
            "\r\n",  
            "\n\r",
            "\n",
            "\r"
          };
      int[] findEol(String prev, int fromIndex) {
          int ix_eol = -1;
          int ix_nl = -1;

          for (String ls : LSs) {
              int i1 = prev.indexOf(ls, fromIndex);
              if (i1 > -1 && (ix_eol == -1 || i1 < ix_eol)) {
                  ix_eol = i1;
                  ix_nl = ix_eol + ls.length();
              }
          }
          
          return new int[] { ix_eol , ix_nl };
      }
      
      public void flush() throws IOException {
          super.flush();
          byte[] buf = this.toByteArray();
          CharBuffer out = decoder.decode(ByteBuffer.wrap(buf, 0, buf.length));
          prev = prev + out.toString();  
          this.reset();
          
          int i1 = 0;
          int i2;
          int[] a;
          while ((i2 = (a = findEol(prev, i1))[0]) > -1) {
              println(prev.substring(i1, i2));
              i1 = a[1];
          }
          if (i1 > 0) {
              prev = prev.substring(i1);
          }
      }
        
      public void close() throws IOException {
          super.close();
          if (prev.length() > 0) {
              println(prev);
          }
      }

      /**
       * 
       * @param category "stdout" or "stderr"
       * @param level "INFO" or "WARN"
       * @return
       */
      public static PrintStream getPrintStream(String category, String level) {
       return new PrintStream(new LoggerOutputStream(Logger.getLogger(category), Level.toLevel(level)), true);       
      }
    
    }



Код

System.setErr(LoggerOutputStream.getPrintStream("stderr", "WARN"));
System.setOut(LoggerOutputStream.getPrintStream("stdout", "INFO"));

System.out.print("f1 ");
System.err.print("e1 ");

System.out.print("f2 ");
System.err.print("e2 ");

System.out.print("f3");
System.err.print("e3");

System.out.println();
System.err.println();


Код

17:08:51,796  INFO stdout - f1 f2 f3
17:08:51,796  WARN stderr - e1 e2 e3



Это сообщение отредактировал(а) leniviy - 7.4.2011, 16:24
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2434 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.