O modalitate mai bună de a genera o matrice cu toate literele din alfabet (Programare, Java)

Stupid.Fat.Cat a intrebat.

În acest moment fac

for (char c = 'a'; c <= 'z'; c++) {
    alphabet[c - 'a'] = c;
}

dar există o modalitate mai bună de a face acest lucru? Similar cu Scala’s 'a' to 'z'

Comentarii

  • Poți să precizezi care este cazul de utilizare. Unde aveți nevoie de matrice? –  > Por Rohit Jain.
  • Ce vrei să spui prin „mai bine”. este "abcdefghijklmnopqrstuvwxyz".toCharArray() mai bine? –  > Por Pshemo.
  • Rețineți că cele de mai sus depind oarecum artificial de faptul că toate literele romane minuscule din ASCII/Unicode sunt contigue. Nu ar funcționa, de exemplu, cu EBCDIC. –  > Por Lecturi fierbinți.
  • Prin mai bine, mă refer doar la faptul că pentru cod să arate mai frumos. Nu-mi pasă prea mult de performanță. –  > Por Stupid.Fat.Cat.
  • Care alfabet? Sunt mult mai multe decât ați putea crede. –  > Por Raedwald.
17 răspunsuri
Hunter McMillen

Cred că acest lucru se termină un pic mai curat, nu trebuie să vă ocupați de scăderea și indexarea:

char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();

Comentarii

  • Și puteți adăuga cu ușurință caractere suplimentare după cum doriți. –  > Por Hot Licks.
  • Ah, m-am gândit că ar fi putut exista o modalitate mai curată de a face acest lucru fără a tasta totul sau bucle. 🙁 Presupun că voi merge cu asta. Mulțumesc! –  > Por Stupid.Fat.Cat.
  • @HunterMcMillen Fișiere sursă Java sunt Unicode (deci, într-un literal de șir de caractere, asta este ceea ce aveți și asta este tot ce puteți adăuga). –  > Por Tom Blodget.
  • Swift 2: let alphabet = Array(„ABCDEFGHIJKLMNOPQRSTUVWXYZ”.characters) – –  > Por Viktor Kucera.
  • @Thilo posibil, dar nu toți utilizatorii sunt susceptibili de a utiliza același alfabet, așa că atunci vă aflați în situația delicată „Să stocăm toate alfabetele ca constante?” sau „Putem chiar să facem asta în mod rezonabil, deoarece unele alfabete sunt foarte mari?”. –  > Por Hunter McMillen.
stinepike
char[] alphabet = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

Comentarii

    19

  • Chiar îmi doream asta! Mulțumesc că m-ai ajutat să copiez și să lipesc 🙂 –  > Por Ranjith V.
Boris

Aceasta este o soluție Unicode distractivă.

char[] alpha = new char[26]
for(int i = 0; i < 26; i++){
    alpha[i] = (char)(97 + i)
}

Aceasta generează o versiune cu litere mici a alfabetului, dacă doriți litere mari, puteți înlocui „97” cu „65”.

Sper că vă ajută.

Comentarii

  • char deține un cod unitar UTF-16, dintre care unul sau două fac un punct de cod Unicode. Denumirea de ASCII distrage atenția de la aceste fapte. –  > Por Tom Blodget.
  • Voi vota acest lucru dacă adăugați și ^ sau cel puțin ~ –  > Por Piotr Findeisen.
  • k este redundant. Doar faceți 'a' + i. –  > Por shmosel.
Vahe Gharibyan

Definiți orice limbă ca fiind un enum și apelați getAlphabet();

char[] armenianAlphabet = getAlphabet(LocaleLanguage.ARMENIAN);
char[] russianAlphabet = getAlphabet(LocaleLanguage.RUSSIAN);

// get uppercase alphabet 
char[] currentAlphabet = getAlphabet(true);
    
System.out.println(armenianAlphabet);
System.out.println(russianAlphabet);
System.out.println(currentAlphabet);

rezultat

I/System.out: աբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆ

I/System.out: абвгдежзийклмнопрстуфхцчшщъыьэюя

I/System.out: ABCDEFGHIJKLMNOPQRSTUVWXYZ

private char[] getAlphabet(){
    return getAlphabet(false);
}

private char[] getAlphabet(boolean flagToUpperCase){
    Locale locale = getResources().getConfiguration().locale;
    LocaleLanguage language = LocaleLanguage.getLocalLanguage(locale);
    return getAlphabet(language, flagToUpperCase);
}

private char[] getAlphabet(LocaleLanguage localeLanguage, boolean flagToUpperCase){
    if (localeLanguage == null)
        localeLanguage = LocaleLanguage.ENGLISH;

    char firstLetter = localeLanguage.getFirstLetter();
    char lastLetter = localeLanguage.getLastLetter();
    int alphabetSize = lastLetter - firstLetter + 1;

    char[] alphabet = new char[alphabetSize];

    for (int index = 0; index < alphabetSize; index++ ){
        alphabet[index] = (char) (index + firstLetter);
    }

    if (flagToUpperCase){
        alphabet = new String(alphabet).toUpperCase().toCharArray();
    }

    return alphabet;
}

private enum LocaleLanguage{
    ARMENIAN(new Locale("hy"), 'ա', 'ֆ'),
    RUSSIAN(new Locale("ru"), 'а','я'),
    ENGLISH(new Locale("en"), 'a','z');

    private final Locale mLocale;
    private final char mFirstLetter;
    private final char mLastLetter;

    LocaleLanguage(Locale locale, char firstLetter, char lastLetter) {
        this.mLocale = locale;
        this.mFirstLetter = firstLetter;
        this.mLastLetter = lastLetter;
    }

    public Locale getLocale() {
        return mLocale;
    }

    public char getFirstLetter() {
        return mFirstLetter;
    }

    public char getLastLetter() {
        return mLastLetter;
    }

    public String getDisplayLanguage(){
        return getLocale().getDisplayLanguage();
    }

    public String getDisplayLanguage(LocaleLanguage locale){
        return getLocale().getDisplayLanguage(locale.getLocale());
    }

    @Nullable
    public static LocaleLanguage getLocalLanguage(Locale locale){
        if (locale == null)
            return LocaleLanguage.ENGLISH;

        for (LocaleLanguage localeLanguage : LocaleLanguage.values()){
            if (localeLanguage.getLocale().getLanguage().equals(locale.getLanguage()))
                return localeLanguage;
        }

        return null;
    }
}

Piyush Ghediya

În Java 8 cu Stream API, puteți face acest lucru.

IntStream.rangeClosed('A', 'Z').mapToObj(var -> (char) var).forEach(System.out::println);

tom thomas

Dacă utilizați Java 8

char[] charArray = IntStream.rangeClosed('A', 'Z')
    .mapToObj(c -> "" + (char) c).collect(Collectors.joining()).toCharArray();

Comentarii

  • Hm da – se pare că nu există o soluție bună pentru acest lucru folosind fluxuri, deoarece nu există CharStream. Dacă adăugați un pic de explicații, aș putea chiar să dau un upvote, deși nu aș recomanda această abordare – nu este în niciun caz mai bună decât buclele. –  > Por Hulk.
  • @Hulk: sigur, dar ai putea să returnezi un Stream<Character> CharStream = IntStream.rangeClosed('a', 'z').mapToObj(c -> (char) c); și să folosești asta din acel moment. stackoverflow.com/questions/22435833/… – –  > Por Klemen Tusar.
  • @techouse sigur, dar OP a vrut un char[] – pentru asta, boxarea și unboxarea nu pot fi evitate cu fluxurile. –  > Por Hulk.
Rajagopal Naidu

Verificați acest lucru o dată sunt sigur că veți obține a la z alfabete:

for (char c = 'a'; c <= 'z'; c++) {
    al.add(c);
}
System.out.println(al);'

Razan Mitwalli
static String[] AlphabetWithDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};

Comentarii

  • Cel mai bun răspuns din toate timpurile…  > Por ucMedia.
jker

cu io.vavr

public static char[] alphanumericAlphabet() {
    return CharSeq
            .rangeClosed('0','9')
            .appendAll(CharSeq.rangeClosed('a','z'))
            .appendAll(CharSeq.rangeClosed('A','Z'))
            .toCharArray();
}

Comentarii

  • Scrieți o explicație. –  > Por Gufran Hasan.
ScrappyDev

Iată câteva alternative bazate pe răspunsul lui tom thomas.

Array de caractere:

        char[] list = IntStream.concat(
                IntStream.rangeClosed('0', '9'),
                IntStream.rangeClosed('A', 'Z')
        ).mapToObj(c -> (char) c+"").collect(Collectors.joining()).toCharArray();

String Array:

Notă: Nu va funcționa corect dacă delimitatorul este și el una dintre valori.

        String[] list = IntStream.concat(
                IntStream.rangeClosed('0', '9'),
                IntStream.rangeClosed('A', 'Z')
        ).mapToObj(c -> (char) c+",").collect(Collectors.joining()).split(",");

String List:

Notă: Nu va funcționa corect dacă și delimitatorul este una dintre valori.

        List<String> list = Arrays.asList(IntStream.concat(
                IntStream.rangeClosed('0', '9'),
                IntStream.rangeClosed('A', 'Z')
        ).mapToObj(c -> (char) c+",").collect(Collectors.joining()).split(","));

gsamaras

Simplitatea este o virtute. Folosiți această matrice ușor de citit în mod natural:

char alphabet[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

Sergi
char[] abc = new char[26];

for(int i = 0; i<26;i++) {
    abc[i] = (char)('a'+i);
}

Comentarii

  • Castul interior nu este necesar. –  > Por shmosel.
Nishant

Utilizarea fluxurilor Java 8

  char [] alphabets = Stream.iterate('a' , x -> (char)(x + 1))
            .limit(26)
            .map(c -> c.toString())
            .reduce("", (u , v) -> u + v).toCharArray();

applecrusher

Pentru a obține litere majuscule în plus față de litere minuscule, ați putea, de asemenea, să faceți următoarele:

String alphabetWithUpper = "abcdefghijklmnopqrstuvwxyz" + "abcdefghijklmnopqrstuvwxyz".toUpperCase();
char[] letters = alphabetWithUpper.toCharArray();

Ruchira Gayan Ranaweera

În cele din urmă veți obține un char array cu alfabet. De ce ați făcut-o atât de greu folosind a loop ?

Este doar

char[] alphabet=new char[]{'a','b',.........,'z'}

Anonimul
import java.util.*;
public class Experiments{


List uptoChar(int i){
       char c='a'; 
        List list = new LinkedList();
         for(;;) {
           list.add(c);
       if(list.size()==i){
             break;
           }
       c++;
            }
        return list;
      } 

    public static void main (String [] args) {

        Experiments experiments = new Experiments();
          System.out.println(experiments.uptoChar(26));
    } 

Comentarii

  • Este o încercare intenționată de ofuscare? for(;;) cu un contor extern și break… și nici o verificare că i>='a' –  > Por Hulk.
jaimebl
for (char letter = 'a'; letter <= 'z'; letter++)
{
    System.out.println(letter);
}

Tags: