如何子串并获取前一个字符
How to substring and get previous character
我对 java 还是很陌生,我搜索用另一个字符串替换字符串的一部分,除非该字符串的前一个字符是 C、V、M、G 或 W。如果我得到 BILLE
作为输入,我希望输出给我 B.Y.E
但如果我得到 MILLE
作为输入,我希望 MILLE
作为输出。
这是我试过的:
import java.util.HashMap;
import java.util.Map;
public class Phaille {
static Map<String, String> phaille2 = new HashMap<String, String>();
static {
phaille2.put("ILL", ".Y.");
}
public static String phaille1(final String tampon){
int position= tampon.indexOf("ILL");
String sub=tampon.substring(position,tampon.length());
if (position != -1 ){
if(!(sub.endsWith("C"))){
return phaille2.get(tampon);
}
}
return tampon;
}
}
但是当我用 "CYRILLE"
、"CECILLE"
、"ILL"
、"CILLILLILL"
进行测试时,测试给了我
org.junit.ComparisonFailure: expected:<null> but was:<"CYR.Y.E">.
试试这个代码:
public static void main(String[] args) {
String s1 = "BILLE";
String s2 = "MILLE";
String pattern = "(?<![WCVMG])ILL";
System.out.println(s1.replaceAll(pattern, ".Y."));
System.out.println(s2.replaceAll(pattern, ".Y."));
System.out.println("CYRILLE".replaceAll(pattern, ".Y."));
System.out.println("CILLILLILL".replaceAll(pattern, ".Y."));
}
O/P :
B.Y.E
MILLE
CYR.Y.E
CILL.Y..Y.
单元测试输出有点混乱(可能应该颠倒比较顺序以使消息合理)。但基本上,它说的是你 returning null
而不是 returning CYR.Y.E
.
你正在 returning null
因为这条线:
return phaille2.get(tampon);
你的tampon
就是原来的字符串CYRILLE
。 phaille2
中没有与键 CYRILLE
匹配的项目(只有 ILL
的项目),因此 HashMap
returns null
,这就是你 return.
你正在做的是:
- 正在寻找
ILL
的位置(很好)。
- 从那个位置forward找到
tabmpon
的子串(为什么?这会给你ILLE
)。
- 正在检查它是否以
C
开头(不会,因为它总是以 ILL
开头,因为那是您正在搜索的内容)。
- 返回基于
tampon
的密钥,我已经告诉过你,哈希 table. 中不存在该密钥
你应该做什么:
- 像你一样找到
ILL
的位置。
如果位置为 0,将 ILL
替换为 HashTable
包含的 "ILL"
的内容(不是 tampon
).
- 你应该从你找到的
ILL
的位置之前取出 tampon
的子串,
- 然后添加您从
HashTable
中获得的替代品
- 然后在
ILL
. 之后添加tampon
的子串
您可能需要稍微尝试一下才能得到正确的数字。
- 如果位置为-1,则数字中没有
ILL
,需要原样returntampon
- 如果位置为正,请查看
tampon.charAt(position-1)
中的内容,然后决定是否需要替换 ILL
(如上所述)。
我建议 against 使用正则表达式,因为我不认为你的 class 在这一点上有人教过它,从你的问题看来你应该用 substring
.
来解决这个问题
我对 java 还是很陌生,我搜索用另一个字符串替换字符串的一部分,除非该字符串的前一个字符是 C、V、M、G 或 W。如果我得到 BILLE
作为输入,我希望输出给我 B.Y.E
但如果我得到 MILLE
作为输入,我希望 MILLE
作为输出。
这是我试过的:
import java.util.HashMap;
import java.util.Map;
public class Phaille {
static Map<String, String> phaille2 = new HashMap<String, String>();
static {
phaille2.put("ILL", ".Y.");
}
public static String phaille1(final String tampon){
int position= tampon.indexOf("ILL");
String sub=tampon.substring(position,tampon.length());
if (position != -1 ){
if(!(sub.endsWith("C"))){
return phaille2.get(tampon);
}
}
return tampon;
}
}
但是当我用 "CYRILLE"
、"CECILLE"
、"ILL"
、"CILLILLILL"
进行测试时,测试给了我
org.junit.ComparisonFailure: expected:<null> but was:<"CYR.Y.E">.
试试这个代码:
public static void main(String[] args) {
String s1 = "BILLE";
String s2 = "MILLE";
String pattern = "(?<![WCVMG])ILL";
System.out.println(s1.replaceAll(pattern, ".Y."));
System.out.println(s2.replaceAll(pattern, ".Y."));
System.out.println("CYRILLE".replaceAll(pattern, ".Y."));
System.out.println("CILLILLILL".replaceAll(pattern, ".Y."));
}
O/P :
B.Y.E
MILLE
CYR.Y.E
CILL.Y..Y.
单元测试输出有点混乱(可能应该颠倒比较顺序以使消息合理)。但基本上,它说的是你 returning null
而不是 returning CYR.Y.E
.
你正在 returning null
因为这条线:
return phaille2.get(tampon);
你的tampon
就是原来的字符串CYRILLE
。 phaille2
中没有与键 CYRILLE
匹配的项目(只有 ILL
的项目),因此 HashMap
returns null
,这就是你 return.
你正在做的是:
- 正在寻找
ILL
的位置(很好)。 - 从那个位置forward找到
tabmpon
的子串(为什么?这会给你ILLE
)。 - 正在检查它是否以
C
开头(不会,因为它总是以ILL
开头,因为那是您正在搜索的内容)。 - 返回基于
tampon
的密钥,我已经告诉过你,哈希 table. 中不存在该密钥
你应该做什么:
- 像你一样找到
ILL
的位置。 如果位置为 0,将
ILL
替换为HashTable
包含的"ILL"
的内容(不是tampon
).- 你应该从你找到的
ILL
的位置之前取出tampon
的子串, - 然后添加您从
HashTable
中获得的替代品
- 然后在
ILL
. 之后添加
tampon
的子串您可能需要稍微尝试一下才能得到正确的数字。
- 你应该从你找到的
- 如果位置为-1,则数字中没有
ILL
,需要原样returntampon
- 如果位置为正,请查看
tampon.charAt(position-1)
中的内容,然后决定是否需要替换ILL
(如上所述)。
我建议 against 使用正则表达式,因为我不认为你的 class 在这一点上有人教过它,从你的问题看来你应该用 substring
.