#java #string
#java #строка
Вопрос:
У меня есть массив строк
String a = "This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty.";
String a1[]=a.split(" ");
for(String temp: a1)
{
System.out.println(temp);
}
Здесь «жизнь» повторяется три раза. Теперь мне нужно удалить только одну частоту повторяющегося массива словоформ.
пожалуйста, направьте меня….
Спасибо.
Комментарии:
1. это не
Array
!!!2. компилируется ли этот код вообще?. Вы получите ошибку String cannot be converted to String[] Строка не может быть преобразована в String[]
3. Не ясно, что вы хотите здесь сделать. Было бы полезно, если бы вы могли опубликовать последнюю строку, которую вы хотите. Это облегчило бы нам ответ
4. что вы имеете в виду под одной частотой дублирования?
5. Отредактируйте вопрос, чтобы в нем не указывался строковый массив. Немного отформатируйте код, чтобы люди могли лучше его видеть. Укажите вашу проблему (что такое «одна частота дублирования»?) и выделите ее жирным шрифтом.
Ответ №1:
Вы можете использовать что-то вроде этого, но это удалит только первое вхождение указанного слова:
Полный код, который удаляет один дубликат. Вам нужно знать, что он не игнорирует специальные символы, а пробел в этом случае является разделителем.
public static void main(String []args){
String a = "This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty Mitty";
System.out.println(removeOneDuplicate(a));
}
public static String removeOneWord(String str, String word){
int value = str.indexOf(word);
String result = str.substring(0, value);
result = str.substring( value word.length(), str.length());
return resu<
}
public static String removeOneDuplicate(String a){
String [] tmp = a.split(" ");
Map<String, Integer> map = new HashMap<String, Integer>();
for(String s: tmp){
if( map.containsKey(s)){
int value = map.get(s);
if(value == 1)
a = removeOneWord(a, s);
map.put(s, value 1);
}
else
map.put(s, 1);
}
return a;
}
Пример результатов:
INPUT: This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty Mitty
OUTPUT: This is a and our life will be full fun just like the Benn Steller's Secret life of Walter Mitty
В результате вы можете видеть, что life
of
и Mitty
удаляется.
Редактировать
Если вы хотите удалить все дубликаты и оставить первое появление слова, измените следующие строки:
int value = str.indexOf(word);
-> int value = str.lastIndexOf(word);
int value = map.get(s);
if(value == 1)
a = removeOneWord(a, s);
map.put(s, value 1);
Для:
a = removeOneWord(a, s);
Комментарии:
1. Это не ответ на вопрос. Он удаляет указанное слово, но не «одну частоту повторяющегося слова» и определенно не дублирует.
2. не могли бы вы объяснить , что он имел в виду , говоря об одной частоте дублирования ?
3. Я надеюсь, что это то, чего хотел ОП.
4. вывод полностью неверен, потому что он удаляет первый ресурс и сохраняет остальные. Он должен сохранить первое и удалить остальные.
5. Это очень просто достичь, но я не уверен, что это то, чего хочет OP. Удалите
if(value == 1)
и изменитеstr.indexOf(word)
наstr.lastIndexOf(word)
, и вы получите это.
Ответ №2:
Прежде всего, приведенный вами пример не является строковым массивом. Это строка.
Я даю решение, основанное на строке. Если вам это нужно для массива строк, вы сможете сделать это самостоятельно, если вы это понимаете.
Во-первых, давайте возьмем строковый токенизатор. Токенизатор разбивает строку на части по заданному набору символов. В своей простейшей форме он разбивает строку на части пробелом. Например, строка str = «Это тест». Простой токенизатор разобьет эту строку на слова типа «Это», «это», «тест».
Ниже приведен код для объявления и использования токенизатора:
StringTokenizer st = new StringTokenizer(a); // a is given your string
Теперь мы объявляем массив строк ниже. (Массив string — это массив, элемент каждого массива представляет собой одну строку.)
String[] str_arr = new String[100];
Теперь мы будем использовать токенизатор, чтобы получить каждое слово вашей строки и сохранить каждое слово в массиве строк, как показано ниже:
int index=0; // to keep track of index of the array (of strings)
while (st.hasMoreElements()) {
str_arr[index] = (String) st.nextElement();
index ;
}
Итак, теперь у нас есть массив строк с именем ‘str_arr’. Теперь мы проверим для каждого элемента массива, встречаются ли повторяющиеся значения или нет. Если мы найдем дубликат, мы заменим его нулевым значением. Но мы сделаем это только один раз. Остальные дубликаты будут сохранены как есть, это то, о чем вы просили, верно?
Чтобы отслеживать строку, которая уже была найдена и стала нулевой, мы будем использовать хэш-карту, подобную этой.
HashMap<String, Integer> hash_map = new HashMap<String, Integer>();
Теперь мы запустим 2 вложенных цикла, и после этого у нас будет модифицированный массив, в котором только многократное вхождение строки уменьшается на 1.
for(int i=0; i<index; i ){
String current_string = str_arr[i];
for(int j=i 1; j<index; j ){
if( (current_string.equals(str_arr[j])) amp;amp; (hash_map.containsKey(current_string)==false) amp;amp; str_arr[j]!=""){
hash_map.put(str_arr[j], 1);
str_arr[j]="";
break;
}
}
}
Теперь вы можете распечатать все слова просто, как показано ниже:
for(int i=0; i<index; i )
System.out.print(str_arr[i] " ");
INPUT: This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty.
OUTPUT: This is a life and our will be full of fun just like the Benn Steller's Secret life Walter Mitty.
Извините за долгое объяснение, но все же, если вы не можете понять, пожалуйста, прокомментируйте. Я постараюсь ответить.
Спасибо!
Счастливого кодирования 🙂
Комментарии:
1. как вы смогли сохранить всю жизнь и просто удалить ofs?
2. О «жизни» => Я удалил 1 life из 3 вхождений, о «of» => Я удалил 1 of из 2 вхождений. Это то, о чем вы просили, верно?
3. но ваш вывод показал разницу. не могли бы вы тоже проверить мой ответ? но я ничего не удалял, потому что вопрос не задается 🙂
Ответ №3:
Как мы знаем, set вообще не содержит дубликатов.
Мой Код:
String a = "This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty.";
String[] aSpilt = a.split(" ");
List<String> list = Arrays.asList(aSpilt);
System.out.print("The input is : ");
list.forEach((s) -> System.out.print(s " "));
System.out.println();
Set<String> noDuplicateSet = new LinkedHashSet<>();
Set<String> duplicateSet = new LinkedHashSet<>();
list.forEach((i) -> {
if (!noDuplicateSet.add(i) amp;amp; i.equals("life")) {
duplicateSet.add(i " ");
}
});
System.out.print("The output is : ");
noDuplicateSet.forEach((s) -> System.out.print(s " "));
System.out.println("");
duplicateSet.forEach((s) -> System.out.print(s " "));
Мой вывод:
The input is : This is a life and our life will be full of fun just like the Benn Steller's Secret life of Walter Mitty.
The output is : This is a life and our will be full of fun just like the Benn Steller's Secret Walter Mitty
Примечание:
-
Я сохранил первую жизнь и удалил остальные, и of встречался не раз, чего я не касался, потому что вопрос хочет просто сохранить первую жизнь и удалить остальные.
-
Я использовал лямбда-выражение для обхода коллекций
Источники:
Ответ №4:
public static void main(String args[])
{
String s;
Scanner in=new Scanner(System.in);
s=in.nextLine();
String ch[]=s.split(" ");
String m=in.nextLine();
for(int i=;i<ch.length;i )
{
if(ch[i].matches(m))
ch[i]="";
S.o.p(ch[i]);
}
}