Dizeden son karakter nasıl kaldırılır?


483

Bir dizeden son karakteri kaldırmak istiyorum. Bunu yapmayı denedim:

public String method(String str) {
    if (str.charAt(str.length()-1)=='x'){
        str = str.replace(str.substring(str.length()-1), "");
        return str;
    } else{
        return str;
    }
}

Dizenin uzunluğunu alma - 1 ve son harfi hiçbir şeyle değiştirme (silme), ancak programı her çalıştırdığımda, son harfle aynı olan orta harfleri siler.

Örneğin, kelime "hayran"; yöntemi çalıştırdıktan sonra "admie" alıyorum. Hayran kelimesini geri vermesini istiyorum.

Yanıtlar:


665

replacebir mektubun tüm örneklerini değiştirir. Tek yapmanız gereken kullanmak substring():

public String method(String str) {
    if (str != null && str.length() > 0 && str.charAt(str.length() - 1) == 'x') {
        str = str.substring(0, str.length() - 1);
    }
    return str;
}

7
Ben eklemek istiyorum null != str && çek başında.
James Oravec

12
demek istedin str != null &&!
SSpoke

2
@Spoke aynı şey, seninki okumak sadece biraz daha hoş :)
Marko

6
@Marko lol evet standart olduğu için, insanlar kendi eşyalarını oluşturduklarında tuhaf hissediyorlar.
SSpoke

26
@AdamJensen C'de yanlışlıkla yazabilirsiniz if (str = NULL)(her zaman yanlış olarak değerlendirilmez (NULL == 0 == false), aynı zamanda strmuhtemelen yapmak istediğiniz şey olmayan bir değer atarsınız . if (NULL = str)Ancak, NULL bir değişken olmadığı ve atanamadığı için yazamazsınız . Yani, NULL'u sola koymak daha güvenli bir kongre. Bu Java'da bir sorun değil.
Gyan aka Gary Buyn

236

Neden sadece bir astar değil?

private static String removeLastChar(String str) {
    return str.substring(0, str.length() - 1);
}

Tam Kod

import java.util.*;
import java.lang.*;

public class Main {
    public static void main (String[] args) throws java.lang.Exception {
        String s1 = "Remove Last CharacterY";
        String s2 = "Remove Last Character2";
        System.out.println("After removing s1==" + removeLastChar(s1) + "==");
        System.out.println("After removing s2==" + removeLastChar(s2) + "==");

    }

    private static String removeLastChar(String str) {
        return str.substring(0, str.length() - 1);
    }
}

gösteri


8
Boş ve boş dize için kontrol dikkate alınmalıdır .. @BobBobBob sürümü daha iyi
KDjava

1
@KDjava: yukarıdaki, geçerli dizenin geçirildiği dikkate alınarak geçerlidir. başka ben de dize doğru olup olmadığını kontrol etmek için try catch blok eklemek gerekir ...
Fahim Parkar

daha önce return str.substring(0,str.length()-1);iyileştirme olarak null dize için kontrol ekledi
shareef


@FahimParkar: Çünkü son karakterin kaldırmak istediğimiz karakter olmaması mümkün olabilir. Ancak soruya göre, cevabınız doğru
Ash18

91

Bir konuda olduğumuzdan, düzenli ifadeler de kullanılabilir

"aaabcd".replaceFirst(".$",""); //=> aaabc  

3
güzel bir şekilde, sadece X ne olursa olsun, dizenin sonundan tam olarak ne kırpmak istediğinizi tanımlamak istediğinizde / tanımlamanız gerektiğinde
Julien

73

Açıklanan problem ve önerilen çözümler bazen ayırıcıların çıkarılmasıyla ilgilidir. Bu sizin durumunuzsa, Apache Commons StringUtils'e bir göz atın, removeEnd adlı çok zarif bir yöntem vardır .

Misal:

StringUtils.removeEnd("string 1|string 2|string 3|", "|");

Sonuç: "string 1 | string 2 | string 3"


Yukarıda adı geçen StringUtils için JAR: commons.apache.org/proper/commons-lang/download_lang.cgi
Tony H.



19

Bunu kullan:

 if(string.endsWith("x")) {

    string= string.substring(0, string.length() - 1);
 }

11
if (str.endsWith("x")) {
  return str.substring(0, str.length() - 1);
}
return str;

Örneğin, kelime "hayran"; yöntemi çalıştırdıktan sonra "admie" alıyorum. Hayran kelimesini geri vermesini istiyorum.

İngilizce kelimeleri kökten çıkarmaya çalışıyorsanız

Stemming, bükülmüş (veya bazen türetilmiş) kelimeleri kök, taban veya kök formlarına (genellikle yazılı bir kelime formuna) indirgeme sürecidir.

...

Örneğin, İngilizce için bir kök oluşturucu "kedi" dizesini (ve muhtemelen "kedi benzeri", "sığır" vb.) Kök "kedi" ve "kök", "kök" "kök" dayalı. Bir stemming algoritması "balık tutma", "balık tutma", "balık" ve "balıkçı" kelimelerini "balık" kök kelimesine indirger.

Lucene stemmers arasındaki fark: EnglishStemmer, PorterStemmer, LovinsStemmer bazı Java seçeneklerini ana hatlarıyla belirtir .


11

Kotlin'de string sınıfının dropLast () yöntemini kullanabilirsiniz. Dize verilen sayıyı düşecek, yeni bir dize döndürecek

var string1 = "Some Text"
string1 = string1.dropLast(1)

9

Okunabilirlik söz konusu olduğunda, bunun en özlü olduğunu düşünüyorum

StringUtils.substring("string", 0, -1);

Negatif dizinler Apache'nin StringUtils yardımcı programında kullanılabilir. Tüm negatif sayılar, dizenin sonundaki uzaklıktan işlenir.


Bunun en iyi cevap olduğunu söyleyemem - basitlik için org.apache.commons.lang.StringUtils.chop () yöntemini kullanın. Yine de, -1 ile olan numara gerçekten güzel ve diğer cevaplara bakmak gerçekten kullanılmıyor / iyi bilinmiyor.
iaforek

4

'xxx'in son tekrarını kaldırır:

    System.out.println("aaa xxx aaa xxx ".replaceAll("xxx([^xxx]*)$", "$1"));

'xxx' ifadesinin sonuncusunu sonlandırırsa:

    System.out.println("aaa xxx aaa  ".replaceAll("xxx\\s*$", ""));

'xxx' ifadesini istediğiniz gibi değiştirebilirsiniz ancak özel karakterlere dikkat edin


4
 // creating StringBuilder
 StringBuilder builder = new StringBuilder(requestString);
 // removing last character from String
 builder.deleteCharAt(requestString.length() - 1);

3
public String removeLastChar(String s) {
    if (!Util.isEmpty(s)) {
        s = s.substring(0, s.length()-1);
    }
    return s;
}

3

StringBuilder Sınıfına Bakın:

    StringBuilder sb=new StringBuilder("toto,");
    System.out.println(sb.deleteCharAt(sb.length()-1));//display "toto"

2
// Remove n last characters  
// System.out.println(removeLast("Hello!!!333",3));

public String removeLast(String mes, int n) {
    return mes != null && !mes.isEmpty() && mes.length()>n
         ? mes.substring(0, mes.length()-n): mes;
}

// Leave substring before character/string  
// System.out.println(leaveBeforeChar("Hello!!!123", "1"));

public String leaveBeforeChar(String mes, String last) {
    return mes != null && !mes.isEmpty() && mes.lastIndexOf(last)!=-1
         ? mes.substring(0, mes.lastIndexOf(last)): mes;
}

2

Tek satırlık bir cevap (sadece komik bir alternatif - bunu evde denemeyin ve zaten verilen harika cevaplar):

public String removeLastChar(String s){return (s != null && s.length() != 0) ? s.substring(0, s.length() - 1): s;}


2

Buradaki cevapların çoğu vekil çiftleri unuttu .

Örneğin, 𝕫 karakteri (kod noktası U + 1D56B) tek bir karaktere sığmaz char, bu nedenle temsil edilmek için iki karakterden oluşan bir vekil çift oluşturmalıdır.

Biri şu anda kabul edilen cevabı uygularsa (kullanarak str.substring(0, str.length() - 1), vekil çifti ekler ve beklenmedik sonuçlara yol açar.

Ayrıca son karakterin bir vekil çift olup olmadığını kontrol etmelidir:

public static String removeLastChar(String str) {
    Objects.requireNonNull(str, "The string should not be null");
    if (str.isEmpty()) {
        return str;
    }

    char lastChar = str.charAt(str.length() - 1);
    int cut = Character.isSurrogate(lastChar) ? 2 : 1;
    return str.substring(0, str.length() - cut);
}

Bir köşe davasında: bu hiç fırlayabilir IndexOutOfBoundsExceptionmi? (örn. Character.isSurrogate, aslında hiç karakter olmadığında str.length()-cutnegatif yaparak true değerini döndürmek mümkündür ).
GPI

Evet, bu mümkün. Zaten geçersiz bir dize, ama yine de - mümkün, evet. Bir sonra değiştirmelisiniz 2tarafından Math.min(2, str.length()).
MC İmparatoru

1

Java 8

import java.util.Optional;

public class Test
{
  public static void main(String[] args) throws InterruptedException
  {
    System.out.println(removeLastChar("test-abc"));
  }

  public static String removeLastChar(String s) {
    return Optional.ofNullable(s)
      .filter(str -> str.length() != 0)
      .map(str -> str.substring(0, str.length() - 1))
      .orElse(s);
    }
}

Çıktı: test-ab


1
 "String name" = "String name".substring(0, ("String name".length() - 1));

Bunu kodumda kullanıyorum, kolay ve basit. sadece dize> 0 ise çalışır. Ben bir düğmeye bağlı ve aşağıdaki if deyimi içinde var

if ("String name".length() > 0) {
    "String name" = "String name".substring(0, ("String name".length() - 1));
}

1
public String removeLastCharacter(String str){
       String result = null;
        if ((str != null) && (str.length() > 0)) {
          return str.substring(0, str.length() - 1);
        }
        else{
            return "";
        }

}

0

gibi özel bir karakteriniz varsa; Json sadece String.replace (";", "") kullanın aksi takdirde son eksi dizede tüm karakteri yeniden yazmanız gerekir.


0

Sonunda özyinelemede char nasıl yapılır:

public static String  removeChar(String word, char charToRemove)
    {
        String char_toremove=Character.toString(charToRemove);
        for(int i = 0; i < word.length(); i++)
        {
            if(word.charAt(i) == charToRemove)
            {
                String newWord = word.substring(0, i) + word.substring(i + 1);
                return removeChar(newWord,charToRemove);
            }
        }
        System.out.println(word);
        return word;
    }

Örneğin:

removeChar ("hello world, let's go!",'l')  "heo word, et's go!llll"
removeChar("you should not go",'o')  "yu shuld nt goooo"

0

Temel Çok Dilli Düzlem'in (Java 8+) dışındaki kod noktalarıyla çalışan bir yanıt.

Akışları kullanma:

public String method(String str) {
    return str.codePoints()
            .limit(str.codePoints().count() - 1)
            .mapToObj(i->new String(Character.toChars(i)))
            .collect(Collectors.joining());
}

Daha verimli olabilir:

public String method(String str) {
    return str.isEmpty()? "": str.substring(0, str.length() - Character.charCount(str.codePointBefore(str.length())));
}

0

Alt dize kullanabiliriz. İşte örnek,

public class RemoveStringChar 
{
    public static void main(String[] args) 
    {   
        String strGiven = "Java";
        System.out.println("Before removing string character - " + strGiven);
        System.out.println("After removing string character - " + removeCharacter(strGiven, 3));
    }

    public static String removeCharacter(String strRemove, int position)
    {   
        return strRemove.substring(0, position) + strRemove.substring(position + 1);    
    }
}

0

sadece "if" koşulunu şu şekilde değiştirin:

if(a.substring(a.length()-1).equals("x"))'

bu sizin için hile yapacak.


0

Dize toplam uzunluğu = 24 varsayalım pozisyon 14 bittikten sonra son karakteri kesmek istiyorum, demek istiyorum ki 14 başlangıç ​​orada olmak istiyorum. Bu yüzden aşağıdaki çözümü uyguluyorum.

String date = "2019-07-31T22:00:00.000Z";
String result = date.substring(0, date.length() - 14);

0

Benzer bir sorun için kod yazmak zorunda kaldım. Bunu çözebilmemin bir yolu, yinelemeli bir kodlama yöntemi kullandı.

static String removeChar(String word, char charToRemove)
{
    for(int i = 0; i < word.lenght(); i++)
    {
        if(word.charAt(i) == charToRemove)
        {
            String newWord = word.substring(0, i) + word.substring(i + 1);
            return removeChar(newWord, charToRemove);
        }
    }

    return word;
}

Bu konuda gördüğüm kodun çoğu özyineleme kullanmaz, umarım size veya aynı sorunu olan birine yardımcı olabilirim.


0

Çantada keklik:

StringBuilder sb= new StringBuilder();
for(Entry<String,String> entry : map.entrySet()) {
        sb.append(entry.getKey() + "_" + entry.getValue() + "|");
}
String requiredString = sb.substring(0, sb.length() - 1);

-1

Dizedeki son karakteri kaldırmanın tek yolu budur:

Scanner in = new Scanner(System.in);
String s = in.nextLine();
char array[] = s.toCharArray();
int l = array.length;
for (int i = 0; i < l-1; i++) {
    System.out.print(array[i]);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.