2017-09-14 12 views
-1

ArrayListを引数とするメソッドを開発しています。 次に、このメソッドは配列に何らかの変更を加え、変換されたarrayListを返します。 入力配列は{A123、C123、15B2}のようになり、次の出力{Aa123、Cc123、15Bb2}を得たいと思います。既存のupperCaseに新しい値を追加するにはどうすればいいですか?

つまり、大文字の後に同じ小文字を追加する必要があります。

文字の順序と量があります。 Hkjk124、hy71のような文字列を得ることも可能です。

方法を以下に示します。

protected ArrayList<String> enrichValues(ArrayList<String> list) { 
    for (int i = 0; i < list.size(); i++) { 
     char[] charArray = list.get(i).toCharArray(); 

     List<Character> listChars = new ArrayList<>(); 

     for (char c : charArray) { 
      listChars.add(c); 
     } 

     for (int j = 0; j < listChars.size(); j++) { 
      if (listChars.get(j).charValue() == 'A') { 
       listChars.add(j + 1, 'a'); 
      } 
     } 

     String newChar = ""; 

     for (Character c : listChars) 
      newChar += c.toString(); 

     list.set(i, newChar); 
    } 
    return list; 
} 

私が直面している主な問題は、私は文字が大文字であるかどうかを確認する方法がわからないということです。私はチェックの多くを追加する必要がありそのため

if(Character.isLetter(c) && Character.isUpperCase(c)) { 
    listChars.add(j + 1, 'a'); 
} 

if (listChars.get(j).charValue() == 'B') { 
    listChars.add(j + 1, 'b'); 
} 
if (listChars.get(j).charValue() == 'C') { 
    listChars.add(j + 1, 'c'); 
} 

しかし、それは非常に悪いアプローチである は、私のようなものを適用することができませんでした。助けていただければ幸いです。

+0

あなたはアルファベットのASCII値を使って大文字小文字をチェックすることができます – Kick

+1

私は理解しません、どうして 'Character.isUpperCase(c)'メソッドを適用しなかったのですか? – Asew

+0

String.charAt(i)とCharacter.toLower()を使って作業するとうまくいくと思います。私は私のために働くコードの例で以下に答えました。 – Assafs

答えて

1

は魔法のように動作し、それを行うための方法です:

public static ArrayList<String> enrichValues(ArrayList<String> values){ 
    ArrayList<String> array = new ArrayList<String>(); 

    for (String str : values){ //For each string 

     StringBuilder copy = new StringBuilder(); 

     for (char c : str.toCharArray()) {//For each char 

      copy.append(c); 

      if(Character.isLetter(c) && Character.isUpperCase(c)){ 
       copy.append(Character.toLowerCase(c)); 
      } 
     }    
     array.add(copy.toString()); 
    }   
    return array; 
} 

例:

public static void main(String[] args) { 
    String a = "A123"; 
    String b = "C123"; 
    String c = "15B2"; 
    String d = " Hkjk124"; 
    String e = "hy71"; 
    String g = "AbCdE645 DeeeFFD"; 

    ArrayList<String> values = new ArrayList<String>(); 
    values.add(a); 
    values.add(b); 
    values.add(c); 
    values.add(d); 
    values.add(e); 
    values.add(g); 

    values = enrichValues(values); 
    System.out.println(values.toString()); 
} 

出力:[Aa123、Cc123,15Bb2、Hhkjk124、hy71、AabCcdEe645DdeeeFfFfDd]

+0

ありがとうございます。できます! –

+0

@YuryiKvashuk問題はありません:)解決策として質問に答えを入れることを忘れないでください。 – Asew

0

文字が大文字であるかどうかを調べるには、ASCIIアルファベットを使用するだけです。大文字は65から90になります。

文字列の長さに渡ってループを使い、ASCII値が65と90の間であれば各文字をチェックするだけです。 I'veは、コードので((int型)TEMP)22がそのように動作しない可能性がありますが、それはかなり似てますが試していないことを

if((int)temp >= 65 && (int)temp <= 90){ 
//Add the lower case character by adding 22 to the character value (lower case are from 97-122) 
char additionalChar = ((int)temp)+22; 
} 

注:、変数tempと仮定すると、文字列の1つの文字です。

+1

基本的な26文字のラテンアルファベットのみで動作します。 'Character'は、_all_アルファベットを扱う大文字と小文字のテストを含むchar値に関する興味深い事柄をすべて調べる機能を持っています。私、18人!それは未来の波です! (; - >) –

+0

Trueですが、アスキー値を比較するのは間違いなく高速です^^ –

0

正規表現でこれを行うための簡単な方法があります:ここで

final ArrayList<String> outputList = new ArrayList<>(); 

for (String str : list) { 
    final String[] letters = str.replaceAll("[^A-Z]", "").toLowerCase().split(""); 

    final String result = String.format(str.replaceAll("([A-Z])", "$1%s"), letters); 

    outputList.add(result); 
} 

return outputList; 
+0

残念ながら、正しく動作しません。 前の例のテスト値{A123、C123、15B2、Hkjk124、hy71、AbCdE645 DeeeFFD}を使用すると、次の結果が得られます。[A123、C123,15B2、Hkjk124、hy71、AbCadEc645 DeeeeFdFfDf] - Aa123、Cc123、15Bb2、Hhkjk124、hy71、AabCcdEe645DdeeeFfFfDd] –

+0

これは期待通りに動作します。 – alirabiee

1

ListインターフェイスArrayListなど)の具体的な実装を受け入れる方法を書くときは、Listタイプに変更することを検討してください。それはnew Stringインスタンスを作成すると、+=を経由して文字列を連結すること非効率的であることを、それぞれの時間+=が適用される... LinkedListArrayList

あなたが知っているshoudもう一つの:これは、リストの任意の形式で渡すことができます。これを行う代わりに、StringBuilderを使用して、他の文字を追加できる文字列にサイズ変更可能なバッファを割り当てる必要があります。Character.isUpperCase(char)がすでに非文字の文字のfalseを返しますので、

条件​​は、redudantです。

文字を小文字に変換する必要がある場合は、Character.toLowerCase(char)を使用してください。

文字は基本的に整数なので、char c = 65;のようなものを書き、その値を出力すると、65が文字 'A'のASCII値なので、出力に 'A'が表示されます。あなたが32を加えると、あなたは97を得て、これは 'a'です。一緒にすべてを置くあなたはこのような何か書くことができます。

protected List<String> enrichValues(List<String> list) { 
    for (int i = 0; i < list.size(); i++) { 
     StringBuilder sb = new StringBuilder(list.get(i)); 
     for (int j = 0; j < sb.length(); j++) { 
      char c = sb.charAt(j); 
      if (Character.isUpperCase(c)) { 
       sb.insert(++j, Character.toLowerCase(c)); 
      } 
     } 
     list.set(i, sb.toString()); 
    } 
    return list; 
} 

または変換された値のための新しいリストを作成し、この1:元のリストを変異させる方法を、次の試してみてください

char c = ...; 

// c is in range of upper-case characters 
if (c >= 65 && c <= 90) { 
    char lower = c + 32; 
} 

// c is in range of lower-case characters 
if (c >= 97 && c <= 122) { 
    char upper = c - 32; 
} 

protected List<String> enrichValues(List<String> original) { 
    List<String> transformed = new ArrayList<>(list.size()); 
    for (String s : original) { 
     StringBuilder sb = new StringBuilder(s); 
     for (int j = 0; j < sb.length(); j++) { 
      char c = sb.charAt(j); 
      if (Character.isUpperCase(c)) { 
       sb.insert(++j, Character.toLowerCase(c)); 
      } 
     } 
     transformed.add(sb.toString()); 
    } 
    return transformed; 
} 

試験:

System.out.println(enrichValues(Arrays.asList("A123", "C123", "15B2"))); 
// Output: [Aa123, Cc123, 15Bb2] 
関連する問題