2012-06-15 51 views
4

Я работаю над генератором случайных имен, который будет использоваться в игре, которую я разрабатываю, проблема в том, что существуют разные виды с разными стилями именования, и я хотел бы, чтобы один генератор имен работал со всеми из них. У меня есть часть этой проблемы, отсортированной - генератор имен использует ряд шаблонов, один набор для каждого вида игрока/NPC.Составление символов Unicode в Java?

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

+0

Если вы знаете, какие гласные вы должны отметить акцентом, сделайте способ проверить акцент этой гласной. Например, если у вас есть символ 'a', который вы хотите применить акцент, измените его с помощью метода' vowelsWithAccent.getAccent ('a')', который изменит его на 'á'. Метод может использовать «Карта <Символ, Символ>», чтобы дать вам гласный с акцентом. –

+0

См. Также http://stackoverflow.com/a/29111105/32453 – rogerdpack

ответ

3

Unicode имеет «сочетающих» символы, представляющие большинство типов акцентов. Было бы довольно легко случайным образом выбрать комбинирующий символ из массива сочетания символов, которые вы создаете. Тогда вы можете просто поместить любые акценты, которые у вас есть, на любые персонажи, которые вам нравятся.

http://en.wikipedia.org/wiki/Combining_character

Поскольку они представлены кодовых вы можете рассматривать их в качестве персонажа по собственному желанию:

String s = "a" + "\u0300"; // latin lowercase letter a + combining grave accent 
char combining_grave_accent = '\u0300'; 
+0

К сожалению, похоже, что у Java нет API, который позволил бы иметь 'String s = LATIN_LETTER_A | ACCENT_GRAVE' или что-то в этом роде. –

+0

Итак, это можно сделать на Java, нужно просто знать коды символов для объединения символов. Это здорово, потому что я могу добавить метки акцента, а затем нормализовать строку на последнем этапе генерации имен. –

1

Хмм, возможно, используйте 2d-массив и создайте таблицу преобразования, которая будет содержать 2 столбца и сколько бы ни было строк (сколько когда-либо акцентированных символов), теперь в 1-м столбце хранятся каждое акцентированное значение и во втором хранилище значение un-accented, т. е. a, e, i, o, u, и когда вы создаете гласную для имени, вы можете произвольно выбирать, делать акцент или нет, и если вы решите подчеркнуть это, вы будете перебирать массив 2d все акцентированные значения, которые используют «a» или что-то еще, и, получая и проверяя значения во втором столбце (чтобы все акцентированные a были выбраны) массива, затем случайным образом выбирайте один для использования ...

Это долгий путь , я не знаю, как это сделать.

EDIT: здесь некоторый код, чтобы соответствовать тому, что я предложил:

import java.util.ArrayList; 

/** 
* 
* @author David 
*/ 
public class JavaApplication145 { 

    static char[][] chars = new char[6][6]; 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     createConversionTable(); 

     char c = 'u'; 

     ArrayList<String> charsList = getAccentedChar(c); 

     for (int i = 0; i < charsList.size(); i++) { 
      System.out.println(charsList.get(i)); 
     } 

    } 

    private static void createConversionTable() { 
     chars[0] = new char[]{'ù', 'ü', 'é', 'ê', 'ä', 'à'}; 
     chars[1] = new char[]{'u', 'u', 'e', 'e', 'a', 'a'}; 
    } 

    private static ArrayList getAccentedChar(char c) { 

     ArrayList<String> charsList = new ArrayList<>(); 

     for (int i = 0; i < chars[0].length; i++) { 

      for (int x = 0; x < chars[1].length; x++) { 

       if (chars[i][x] == c) { 
        charsList.add(chars[i - 1][x] + ""); 
       } 

      } 
     } 
     return charsList; 
    } 
} 
+1

При использовании двух массивов лучше использовать карту (простой в обслуживании, быстрый доступ). Тем не менее, ваша точка зрения хорошая. –

+0

Да, это было бы еще эффективнее эй ?! +1 ... надеюсь, что у OP появилась идея, и это будет делать –

+0

Возможно, может быть, нет, мы не знаем точно. Тем не менее, вы должны взглянуть на [Java Collections] (http://docs.oracle.com/javase/tutorial/collections/index.html) и немного поработать с реальным кодом, чтобы изучить другие способы внедрения более удобного и улучшенного код производительности. Как я сказал вам, это хорошо, по крайней мере, идея, но в реальном мире вам нужно больше, чем идеи, чтобы выжить :). –

-1

Needed то же самое, так что я в конечном итоге сделать это:

 /** 
* Given a letter and an accent, return the char with the accent included. 
* 
* @param accentCode: The accent char; i.e '~', '´'; 
* @param letter: Letter to put accent in it. 
* @return: Char with {@code letter} with accent if it was a valid letter. 
*/ 
public static int getAccent(char accentChar, int letter) { 
    int index = 0; 
    boolean upperCase = false; 
    for (char vogal : vogalList) { 
     if (letter == vogal) { 
      if (index >= 5) { 
       index -= 5; 
       upperCase = true; 
      } 
      for (int accentType = 0; accentType < convertTable.length; accentType++) { 
       if (convertTable[accentType][0] == accentChar) { 
        char converted = convertTable[accentType][index + 1]; 
        if (converted != '-') { 
         if (upperCase) 
          converted = Character.toUpperCase(converted); 

         return converted; 
        } 
       } 
      } 
     } 
     index++; 
    } 
    return letter; 
} 

/** 
* Verify if {@code charID} is an accent character; 
* 
* @param charID: Character code id to be verified. 
* @return: true in case {@code charID} is an accent character id. 
*/ 
public static boolean isAccent(int charID) { 
    for (int i = 0; i < convertTable.length; i++) { 
     if (convertTable[i][0] == charID) 
      return true; 
    } 
    return false; 
} 

private static final char[] vogalList = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' }; 
private static final char[][] convertTable = { { '´', 'á', 'é', 'í', 'ó', 'ú' }, { '`', 'à', 'è', 'ì', 'ò', 'ù' }, { '^', 'â', 'ê', 'î', 'ô', 'û' }, { '~', 'ã', '-', '-', 'õ', '-' }, { '¨', 'ä', 'ë', 'ï', 'ö', 'ü' } }; 
Смежные вопросы