460 Stimmen

Was ist der einfachste/beste/richtigste Weg, um durch die Zeichen einer Zeichenkette in Java zu iterieren?

Es gibt einige Möglichkeiten, in Java durch die Zeichen einer Zeichenkette zu iterieren:

  1. Verwendung von StringTokenizer ?
  2. Umwandlung der String zu einer char[] und die Iteration darüber.

Was ist der einfachste/beste/richtigste Weg, um zu iterieren?

1voto

unpluggeDloop Punkte 79
public class Main {

public static void main(String[] args) {
     String myStr = "Hello";
     String myStr2 = "World";

     for (int i = 0; i < myStr.length(); i++) {    
            char result = myStr.charAt(i);
                 System.out.println(result);
     } 

     for (int i = 0; i < myStr2.length(); i++) {    
            char result = myStr2.charAt(i);
                 System.out.print(result);              
     }    
   }
}

Sortie :

H
e
l
l
o
World

0voto

Eugene Yokota Punkte 92703

Siehe Die Java-Tutorials: Zeichenketten .

public class StringDemo {
    public static void main(String[] args) {
        String palindrome = "Dot saw I was Tod";
        int len = palindrome.length();
        char[] tempCharArray = new char[len];
        char[] charArray = new char[len];

        // put original string in an array of chars
        for (int i = 0; i < len; i++) {
            tempCharArray[i] = palindrome.charAt(i);
        } 

        // reverse array of chars
        for (int j = 0; j < len; j++) {
            charArray[j] = tempCharArray[len - 1 - j];
        }

        String reversePalindrome =  new String(charArray);
        System.out.println(reversePalindrome);
    }
}

Geben Sie die Länge in int len und verwenden for Schleife.

0voto

Alan Moore Punkte 70949

StringTokenizer ist völlig ungeeignet für die Aufgabe, eine Zeichenkette in ihre einzelnen Zeichen zu zerlegen. Mit String#split() können Sie dies leicht tun, indem Sie eine Regex verwenden, die auf nichts zutrifft, z. B.:

String[] theChars = str.split("|");

Aber StringTokenizer verwendet keine Regexe, und es gibt keine Trennzeichenfolge, die Sie angeben können, die mit dem Nichts zwischen Zeichen übereinstimmen wird. Es est Ein netter kleiner Hack, mit dem Sie das Gleiche erreichen können: Verwenden Sie die Zeichenkette selbst als Begrenzungszeichenfolge (so dass jedes Zeichen darin ein Begrenzungszeichen ist) und lassen Sie die Begrenzungszeichen zurückgeben:

StringTokenizer st = new StringTokenizer(str, str, true);

Ich erwähne diese Möglichkeiten jedoch nur, um sie zu verwerfen. Beide Techniken zerlegen die ursprüngliche Zeichenfolge in Ein-Zeichen-Zeichenfolgen anstelle von char-Primitiven, und beide sind mit einem großen Overhead in Form von Objekterstellung und Zeichenfolgenmanipulation verbunden. Vergleichen Sie dies mit dem Aufruf von charAt() in einer for-Schleife, der praktisch keinen Overhead verursacht.

0voto

Hawkeye Parker Punkte 6550

Ausführlich zu diese Antwort y diese Antwort .

Die obigen Antworten weisen auf das Problem vieler der hier vorgestellten Lösungen hin, die nicht nach dem Wert des Codepunkts iterieren - sie hätten Probleme mit jedem Surrogat-Zeichen . In den Java-Dokumenten wird das Problem ebenfalls beschrieben aquí (siehe "Unicode-Zeichendarstellungen"). Wie auch immer, hier ist etwas Code, der einige tatsächliche Ersatzzeichen aus dem zusätzlichen Unicode-Satz verwendet und sie umwandelt zurück zu einer Zeichenkette. Beachten Sie, dass .toChars() ein Array von Zeichen zurückgibt: Wenn Sie mit Surrogaten arbeiten, haben Sie notwendigerweise zwei Zeichen. Dieser Code sollte funktionieren für cualquier Unicode-Zeichen.

    String supplementary = "Some Supplementary: ";
    supplementary.codePoints().forEach(cp -> 
            System.out.print(new String(Character.toChars(cp))));

0voto

devDeejay Punkte 4796

Dieser Beispielcode wird Ihnen helfen!

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Solution {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        map.put("a", 10);
        map.put("b", 30);
        map.put("c", 50);
        map.put("d", 40);
        map.put("e", 20);
        System.out.println(map);

        Map sortedMap = sortByValue(map);
        System.out.println(sortedMap);
    }

    public static Map sortByValue(Map unsortedMap) {
        Map sortedMap = new TreeMap(new ValueComparator(unsortedMap));
        sortedMap.putAll(unsortedMap);
        return sortedMap;
    }

}

class ValueComparator implements Comparator {
    Map map;

    public ValueComparator(Map map) {
        this.map = map;
    }

    public int compare(Object keyA, Object keyB) {
        Comparable valueA = (Comparable) map.get(keyA);
        Comparable valueB = (Comparable) map.get(keyB);
        return valueB.compareTo(valueA);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X