Удалить повторяющиеся значения из строки в Java - PullRequest
15 голосов
/ 22 июля 2011

Может кто-нибудь, пожалуйста, дайте мне знать, как удалить повторяющиеся значения из

String s="Bangalore-Chennai-NewYork-Bangalore-Chennai"; 

, и вывод должен быть как

String s="Bangalore-Chennai-NewYork-";

с использованием Java ..

Любая помощьбудет оценена.

Ответы [ 14 ]

36 голосов
/ 22 июля 2011

Это делается в одной строке:

public String deDup(String s) {
    return new LinkedHashSet<String>(Arrays.asList(s.split("-"))).toString().replaceAll("(^\\[|\\]$)", "").replace(", ", "-");
}

public static void main(String[] args) {
    System.out.println(deDup("Bangalore-Chennai-NewYork-Bangalore-Chennai"));
}

Вывод:

Bangalore-Chennai-NewYork

Обратите внимание, что порядок сохраняется:)

Ключевые моменты:

  • split("-") дает нам различные значения в виде массива
  • Arrays.asList() превращает массив в список
  • LinkedHashSet сохраняет уникальность и Порядок вставки - он выполняет всю работу, предоставляя нам уникальные значения, которые передаются через конструктор
  • toString() Списка [element1, element2, ...]
  • окончательный replaceКоманды удаляют «пунктуацию» из toString()

Это решение требует, чтобы значения не содержали последовательность символов ", " - разумное требование для такого краткого кода.

Обновление Java 8!

Конечно, это 1 строка:

public String deDup(String s) {
    return Arrays.stream(s.split("-")).distinct().collect(Collectors.joining("-"));
}

Обновление регулярного выражения!

Если вы не заботитесь о сохранении порядка (то есть можно удалить первый экземпляр дубликата):

public String deDup(String s) {
    return s.replaceAll("(\\b\\w+\\b)-(?=.*\\b\\1\\b)", "");
}
4 голосов
/ 22 июля 2011
public static String removeDuplicates(String txt, String splitterRegex)
{
    List<String> values = new ArrayList<String>();
    String[] splitted = txt.split(splitterRegex);
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < splitted.length; ++i)
    {
        if (!values.contains(splitted[i]))
        {
            values.add(splitted[i]);
            sb.append('-');
            sb.append(splitted[i]);
        }
    }
    return sb.substring(1);

}

Использование:

String s = "Bangalore-Chennai-NewYork-Bangalore-Chennai";
s = removeDuplicates(s, "\\-");
System.out.println(s);

Печать:

Bangalore-Chennai-NewYork
2 голосов
/ 22 июля 2011

Вы можете добавить свои строки в HashSet.

  1. Разделить строки на "-".
  2. Сохранить отдельные слова в массиве.то есть arr []

Sinppet:

Set<String> set = new HashSet<String>();

    for(int i=0; i < arr.length; i++){
      if(set.contains(arr[i])){
        System.out.println("Duplicate string found at index " + i);
      } else {
        set.add(arr[i]);
      }
1 голос
/ 01 июля 2016
static String RemoveDuplicateCharInString(String s){
    for (int i = 0; i < s.length(); i++) {
        if((s.substring(i+1)).indexOf(s.charAt(i))!=-1){
            s=s.substring(0,i+1)+(s.substring(i+1)).replaceAll(""+s.charAt(i),"");
        }
    }
    return s;
}
1 голос
/ 22 июля 2011

Создайте массив строк, разделив их на -, а затем создайте из него hashSet.

String s="Bangalore-Chennai-NewYork-Bangalore-Chennai"; 
String[] strArr = s.split("-");
Set<String> set = new HashSet<String>(Arrays.asList(strArr));

Если вы хотите вернуть его как строковый массив, сделайте следующее:

String[] result = new String[set.size()];
set.toArray(result);

Вот пример кода для этого:

String s="Bangalore-Chennai-NewYork-Bangalore-Chennai"; 
String[] strArr = s.split("-");
Set<String> set = new LinkedHashSet<String>(Arrays.asList(strArr));
String[] result = new String[set.size()];
set.toArray(result);
StringBuilder res = new StringBuilder();
for (int i = 0; i < result.length; i++) {
    String string = result[i];
    if(i==result.length-1)
        res.append(string);
    else
        res.append(string).append("-");
}
System.out.println(res.toString());

Выход: -

Bangalore-Chennai-NewYork
1 голос
/ 22 июля 2011

Просто идея:

  1. разобрать строку и разделить токены с помощью разделителя "-"
  2. загрузить токены в Collection
  3. итерацииCollection и удаление дубликатов
  4. используйте результат Collection для построения новой строки

Самая сложная часть должна быть 3, но не невозможна.Если вы используете Set, вы можете пропустить этот шаг.

EDIT возможно, вы можете заменить 2 и 3 проверкой присутствия перед добавлением элемента

0 голосов
/ 18 июля 2018
StringBuilder builderWord = new StringBuilder(word);
for(int index=0; index < builderWord.length(); index++) {
    for(int reverseIndex=builderWord.length()-1; reverseIndex > index;reverseIndex--) {
        if (builderWord.charAt(reverseIndex) == builderWord.charAt(index)) {
            builderWord.deleteCharAt(reverseIndex);
        }
    }
}
return builderWord.toString();
0 голосов
/ 30 января 2017
public class RemDuplicateWordFromString {
public static void main(String[] args) {
    String s1 = "Hello India Hello India Hello India Hello India";
    countWords(s1);
}
public static void countWords(String s1) {
    String[] s2 = s1.split(" ");
    for (int i = 0; i < s2.length; i++) {
        for (int j = i + 1; j < s2.length; j++) {
            if (s2[i].equals(s2[j])) {
                if (i != j) {
                    s2[i] = "";
                }
            }
        }
    }
    for (int i = 0; i < s2.length; i++) {
        if (s2[i] != "") {
            System.out.print(s2[i] + " ");
        }

    }

}

}

0 голосов
/ 12 октября 2016

Немного опоздал к игре, но я бы просто использовал HashMap.Его легко понять, и он быстро ищет ключи, возможно, это не лучший способ, но это хороший ответ для IMO.Я использую его все время, когда мне нужно быстро и грязно отформатировать:

                    String reason = "Word1 , Word2 , Word3";
                    HashMap<String,String> temp_hash = new HashMap<String,String>();
                    StringBuilder reason_fixed = new StringBuilder();
                    //in:
                    for(String word : reason.split(",")){
                        temp_hash.put(word,word);
                    }
                    //out:
                    for(String words_fixed : temp_hash.keySet()){
                        reason_fixed.append(words_fixed + " , ");
                    }
                    //print:
                    System.out.println(reason_fixed.toString());
0 голосов
/ 23 апреля 2016
public static void main(String[] args) {
    String str="Bangalore-Chennai-Newyork-Bangalore-Chennai";
    String output="";
    String [] arr=str.split("-");

    LinkedHashSet<String> lhs=new LinkedHashSet<String>();
    for (int i = 0; i < arr.length; i++) {
        lhs.add(arr[i]);
    }
    for(String s:lhs){
        output=output+s+"-";
    }

    System.out.println(output);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...