web-dev-qa-db-ja.com

Javaで文字列をトリムする正しい方法

Javaでは、文字列をトリムするためにこれをしています:

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.trim();
System.out.println("after->>"+input+"<<-");

出力は次のとおりです。

before->> some Thing <<-
after->>some Thing<<-

動作します。しかし、変数をそれ自体に割り当てることによって、私は正しいことをしているのだろうかと思います。別の変数を作成し、トリミングされた値を割り当てることでリソースを無駄にしたくありません。トリムをその場で実行したいと思います。

だから私はこれを正しくやっていますか?

28
Quest Monger

あなたはそれを正しくやっています。 ドキュメント から:

文字列は定数です。作成後に値を変更することはできません。文字列バッファは可変文字列をサポートします。 Stringオブジェクトは不変であるため、共有できます。

ドキュメント からも:

trim

public String trim()

文字列のコピーを返します。先頭と末尾の空白は省略されます。このStringオブジェクトが空の文字シーケンスを表す場合、またはこのStringオブジェクトで表される文字シーケンスの最初と最後の文字の両方に '\ u0020'(スペース文字)より大きいコードがある場合、このStringオブジェクトへの参照が返されます。

それ以外の場合、文字列に「\ u0020」より大きいコードを持つ文字がない場合、空の文字列を表す新しいStringオブジェクトが作成されて返されます。

そうでない場合、コードが '\ u0020'より大きい文字列の最初の文字のインデックスをkとし、コードが '\ u0020'より大きい文字列の最後の文字のインデックスをmとします。インデックスkの文字で始まり、インデックスmの文字で終わるこの文字列の部分文字列、つまりthis.substring(k、m + 1)の結果を表す新しい文字列オブジェクトが作成されます。

このメソッドは、文字列の最初と最後から空白(上記で定義)を削除するために使用できます。

戻り値

先頭および末尾の空白が削除されたこの文字列のコピー、または先頭または末尾の空白がない場合はこの文字列。

18
gpojd

Javaは不変オブジェクト)の文字列 のように、その場でトリミングを実行する方法はありません。文字列をトリミングするためにできることは、新しいトリミングバージョンを作成することだけですあなたの文字列を返し、それを返します(そしてこれがtrim()メソッドがすることです)。

10
aga

理論的には、変数をそれ自体に割り当てることはありません。メソッドtrim()の戻り値を変数入力に割り当てています。

実際には、trim()メソッドの実装は最適化されており、必要な場合にのみ別の変数を作成(および返す)しています。他の場合(実際にトリミングする必要がない場合)は、元の文字列への参照を返します(この場合、実際に変数を自分自身に割り当てています)。

http://grepcode.com/file/repository.grepcode.com/Java/root/jdk/openjdk/6-b14/Java/lang/String.Java#String.trim%28%29 を参照してください=

とにかく、trim()は元の文字列を変更しないため、これが正しい使用方法です。

2
Dario

String::strip…

古い String::trim メソッドには strange definition of whitespace があります。

前述のように、 here 、Java 11は新しいメソッドを追加します strip… メソッドはStringクラスに追加されます。空白のUnicodeに精通した定義。 Character::isWhitespace については、クラスJavaDocのこの定義の規則を参照してください。

サンプルコード。

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.strip();
System.out.println("after->>"+input+"<<-");

または、 先頭のみ または 末尾のみ の空白を削除できます。

1
Basil Bourque

従来のアプローチは、トリムメソッドをインラインで使用することです...たとえば:

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
System.out.println("after->>"+input.trim()+"<<-");

それがすべての使用のためにトリミングされるべき文字列である場合、あなたがしたように前もってそれをトリミングします。自分の意図を他の開発者に伝えたいなら、あなたがしたように同じメモリの場所を再利用することは悪い考えではありません。 Javaで記述する場合、メモリ管理は重要な問題ではありません。なぜなら、Javaの「ギフト」は、それを管理する必要がないからです。

1
Bruce Chidester

はい。ただし、ガベージコレクターが入力が指していた元の値を削除するまで、2つのオブジェクトが残ります。 Javaは不変です。適切な説明は次のとおりです。 Javaの文字列の不変性

1
Isaac

Java string trim()メソッドは先頭と末尾のスペースを削除します

public class StringTrimExample{  
public static void main(String args[]){  
String s1="  hello string   ";  
System.out.println(s1+"javatpoint");//without trim()  
System.out.println(s1.trim()+"javatpoint");//with trim()  
}}  

output

 hello string   javatpoint
hello stringjavatpoint   
0

Javaのtrim()メソッド、split()メソッドを使用せずにStringをトリムする必要がある場合、次のソースコードが役立ちます。

static String allTrim(String str)
{
    int j = 0;
    int count = 0;  // Number of extra spaces
    int lspaces = 0;// Number of left spaces
    char ch[] = str.toCharArray();
    int len = str.length();
    StringBuffer bchar = new StringBuffer();
    if(ch[0] == ' ')
    {
        while(ch[j] == ' ')
        {
            lspaces++;
            j++;
        }   
    }   
    for(int i = lspaces; i < len; i++)
    {   
        if(ch[i] != ' ')
        {
            if(count > 1 || count == 1)     
            {
                bchar.append(' ');
                count = 0;
            }
            bchar.append(ch[i]);
        }
        else if(ch[i] == ' ')
        {
            count++;    
        }
    }
    return bchar.toString();
}
0
pnkjshrm30