Какой самый простой / лучший / самый правильный способ перебирать символы строки в Java? - PullRequest
274 голосов
/ 13 октября 2008

StringTokenizer? Преобразовать String в char[] и повторить это? Что-то еще?

Ответы [ 14 ]

0 голосов
/ 15 марта 2017

Этот пример кода поможет вам!

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);
    }
}
0 голосов
/ 06 ноября 2016

Разработка этого ответа и этого ответа .

Приведенные выше ответы указывают на проблему многих решений, которые здесь не повторяются по значению кодовой точки - у них могут возникнуть проблемы с любыми суррогатными символами . В документации по Java также описана проблема здесь (см. «Представления символов Unicode»). В любом случае, вот некоторый код, который использует некоторые действительные суррогатные символы из дополнительного набора Unicode и преобразует их обратно в строку. Обратите внимание, что .toChars () возвращает массив символов: если вы имеете дело с суррогатами, у вас обязательно будет два символа. Этот код должен работать для любого символа Unicode.

    String supplementary = "Some Supplementary: ????";
    supplementary.codePoints().forEach(cp -> 
            System.out.print(new String(Character.toChars(cp))));
0 голосов
/ 13 октября 2008

StringTokenizer совершенно не подходит для задачи разбивки строки на отдельные символы. С String#split() вы можете сделать это легко, используя регулярное выражение, которое ничего не соответствует, например ::10000

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

Но StringTokenizer не использует регулярные выражения, и вы не можете указать строку-разделитель, которая будет соответствовать ничему между символами. Там есть один милый маленький хак, который вы можете использовать для достижения того же: используйте саму строку в качестве строки-разделителя (делая каждый символ в ней разделителем) и попросите ее вернуть разделители:

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

Однако я упоминаю эти варианты только с целью их отклонения. Оба метода разбивают исходную строку на односимвольные строки вместо символьных примитивов, и оба требуют больших накладных расходов в форме создания объекта и манипуляции со строками. Сравните это с вызовом charAt () в цикле for, который практически не требует дополнительных затрат.

0 голосов
/ 13 октября 2008

См. Учебные руководства по Java: строки .

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);
    }
}

Поместите длину в int len и используйте for loop.

...