Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

332
Visualizações
¿Una buena manera de extraer una subcadena en minúsculas de una posición determinada?

Uno que conozco es aplicar un Matcher a una subcadena, otro es solo realizar una búsqueda manual para que el primer carácter no esté en minúsculas.

Entonces, ¿cuáles son las buenas maneras de hacer esto?
Usar un Matcher parece ser una gran exageración para una tarea tan simple.

De hecho, es posible usar un método equivalente a C++ find_first_not_of() , pero parece que Java no tiene uno en su biblioteca.

Actualizar:

Bueno, la forma en que Matcher lo hace es de 4 a 10 veces más lenta que hacerlo manualmente, aunque, si se hace correctamente, es agradable y legible (vea la respuesta de Andreas).
Sin embargo, al estar acostumbrado a la idea de que el código generalmente debería ser tan eficiente como pueda hacerlo (manteniéndolo legible), todavía estoy interesado en ver si es posible hacer lo mismo más rápido usando la biblioteca estándar y/o trucos nativos de Java. .

Actualización 2:

Encontré un método idiomático que es un poco más rápido: stream API

Así que los métodos actualmente descubiertos son:

 // 1. Andreas' correction of the Matcher way static String getLowercaseSubstringAt (final String s, final int pos) { Matcher m = Pattern.compile("^\\p{Ll}+").matcher(s).region(pos, s.length()); return (m.find() ? m.group() : ""); } // 2. The same with a static Pattern: 2.5 times faster // I thought the compiler would optimize it by default // Don't like the idea to make the Pattern external static Pattern p = Pattern.compile("^\\p{Ll}+"); static String getLowercaseSubstringAt (final String s, final int pos) { Matcher m = p.matcher(s).region(pos, s.length()); return (m.find() ? m.group() : ""); } // 3. Stream API with a range of indices: 3x the speed of the first // Makes use of the Java way to say `find_first(_not)_of()` static String getLowercaseSubstringAt (final String s, final int pos) { int idx = IntStream.range(pos, s.length()) .filter(i -> !Character.isLowerCase(s.charAt(i))) .findFirst() .orElse(s.length()); return s.substring(pos, idx); } // 4. Doing it manually. Relatively dirty, but fast. 10x the speed static String getLowercaseSubstringAt (final String s, final int pos) { for (int i = pos; i < s.length(); i++) if (!Character.isLowerCase(s.charAt(i))) return s.substring(pos, i); return s.substring(pos); }

Stream API parece la mejor opción en términos de idioma actualmente: sin necesidad de recursos externos, limpio, relativamente rápido.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

No sé por qué dice que la forma de Matcher es realmente un desperdicio, tanto en código como en tiempo.

Claro, una expresión regular es más lenta que un ciclo for simple, pero a menos que esté haciendo esto repetidamente en un ciclo cerrado (más de 1000 veces), no notará la diferencia. Hasta que mida el rendimiento y vea un problema, es probable que no sea un problema. Cuidado con las optimizaciones prematuras.

¿Pero un desperdicio en código? Solo porque lo estás haciendo mal:

 static String getLowercaseSubstringAt (final String s, final int pos) { Matcher m = Pattern.compile("^\\p{Ll}+").matcher(s).region(pos, s.length()); return (m.find() ? m.group() : ""); }

Dado que su expresión no regular estaba usando la verificación completa en minúsculas con Character.isLowerCase() , actualicé la expresión regular para hacer eso también.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda