string class

 
 
 
Сообщения:1
программу которая удаляет все слова в тексте, начинающиеся с прописной буквы
 
 
Сообщения:127
public class Main {
  public static void main(String[] args) {
    String outText = "";
    String text = "Шла Саша по шоссе и сосала сушку";
    String[] s = text.split(" ");
    for (String value : s) {
      String tmp = String.valueOf(value.charAt(0));
      if (tmp == tmp.toUpperCase()) {
         outText += " " + value;
      }
    }
    System.out.println(outText);
  }
}
Изменен:05 июн 2020 12:51
 
 
Сообщения:256
if (tmp == tmp.toUpperCase()) {

Тут всегда false будет.
 
 
Сообщения:127
axwer:
if (tmp == tmp.toUpperCase()) {

Тут всегда false будет.


Чего то я не понял :)) Печатал пример с телефона, но проверял на рабочем компе на работе. Все работало.

Я не совсем понимаю что происходит, на работе стоит Win7 и пример работает как надо, Сейчас же проверяю пример дома на win10 и пример не работает.

Я так понял что проблема с кодировкой, если строку изменить на латиницу то пример снова работает...

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

public class MainTest {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String outText = "";
        String text = new String("Шла Саша по шоссе и сосала сушку".getBytes(), StandardCharsets.UTF_8);
        String[] s = text.split(" ");
        for (String value : s) {
            String tmp = String.valueOf(value.charAt(0));
            if (tmp.equals(tmp.toUpperCase())) {
                outText += " " + value;
            }
        }
        System.out.println(outText);
    }
}


Да, дело действительно в кодировке.

На Win10 данный пример в консоли Win работает нормально. В IDEA тоже нормально, но знаки вопроса вместо букв.
Изменен:05 июн 2020 18:51
 
 
Сообщения:256
В первом примере использовали == для сравнения, поэтому он не должен был работать. В следующем примере, уже equals, здесь уже всё нормально.
 
 
Сообщения:127
axwer:
В первом примере использовали == для сравнения, поэтому он не должен был работать. В следующем примере, уже equals, здесь уже всё нормально.

Он тоже будет работать, дело не в этом, а в кодировке.
Изменен:05 июн 2020 19:08
 
 
Сообщения:114
Он работает просто по удачному стечению обстоятельств. toUpperCase реализован так, что если в строке менять нечего, то возвращает саму строку. Но сравнивать содержимое строк через == не правильно.
 
 
Сообщения:127
Да, я согласен с тем, что не нужно так сравнивать строки, но проблема то все равно не в этом оказалась.
Изменен:05 июн 2020 19:23
 
 
Сообщения:114
А как он не работал-то? Все слова с заглавной считал?
 
 
Сообщения:127
Flashrunner:
А как он не работал-то? Все слова с заглавной считал?


У меня на Win10 первый пример кода в цикле все как true считал. Хотя на Win7 идеально работал.
Изменен:05 июн 2020 20:30
 
 
Сообщения:127
Пример с учетом всех замечаний:
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

public class MainTest {
    public static void main(String[] args) {
        PrintStream ps = new PrintStream(System.out, true, StandardCharsets.UTF_8);
        StringBuilder outText = new StringBuilder();
        String text = new String("Шла Саша по шоссе и сосала сушку".getBytes(), StandardCharsets.UTF_8);
        String[] s = text.split(" ");
        for (String value : s) {
            String tmp = String.valueOf(value.charAt(0));
            if (tmp.equals(tmp.toUpperCase())) {
                outText.append(" ").append(value);
            }
        }
        ps.println(outText);
    }
}
 
 
Сообщения:114
Всё же проблема с кодировкой отношения к делу не имеет, она лично ваша. Нужно просто, чтобы кодировка исходника совпадала с той, с которой он читается компилятором (по умолчанию - системной).
 
 
Сообщения:127
Flashrunner:
Всё же проблема с кодировкой отношения к делу не имеет, она лично ваша. Нужно просто, чтобы кодировка исходника совпадала с той, с которой он читается компилятором (по умолчанию - системной).


По у молчанию файл у меня в кодировке UTF-8. Я сейчас немного поэкспериментировал, компиляция без флагов и запуск без флагов на первом варианте примера не давала правильно рабочий код. Получилось только когда я при компиляции явно указываю кодировку и при запуске...

javac -encoding utf8 MainTest.java

Если я в консоли меняю кодовую страницу например chcp 65001, то что бы пример работал также нужно добавить опцию при запуску примера.
java -Dfile.encoding=UTF-8 MainTest

Но это касаемо только когда в строках есть русский текст, если все строки с английскими буквами, то и без флагов работает.
Изменен:06 июн 2020 09:16
 
 
Сообщения:114
Всё правильно, это потому что системная кодировка у вас не utf8, т.е отличается от кодировки файлов.
 
 
Сообщения:127
Flashrunner:
Всё правильно, это потому что системная кодировка у вас не utf8, т.е отличается от кодировки файлов.


Я компилирую:
javac -encoding utf8 MainTest.java

Запускаю без опций и без указания кодовой страницы консоли: Работает правильно.

Ставлю в консоли кодировку chcp 65001
Запускаю пример не работает... Ну или работает но не видно результат.

Добавляю опцию запуска java -Dfile.encoding=UTF-8 MainTest - Работает правильно.

Я неправильно что то понимаю?
Изменен:06 июн 2020 09:18
 
Модераторы:alon4iknazicaTaky_
Сейчас эту тему просматривают:Нет