java删除列表中的反向字符串

时间:2012-11-10 09:30:22

标签: java string algorithm reverse

我有struct Array或List String,如:

{ "A.B", "B.A", "A.C", "C.A" }

我希望从列表中删除反向字符串,仅限结尾:

{ "A.B", "A.C" }

如何使用String类型以及如何删除反向字符串?

6 个答案:

答案 0 :(得分:1)

检查

public static void main(String arg[]){
    String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";


    List<String> strList = new ArrayList<String>(); 
    strList.add("A.B");
    strList.add("B.A");
    strList.add("A.C");
    strList.add("C.A");

    Iterator<String> itr = strList.iterator();
    while(itr.hasNext()){
        String [] split = itr.next().toUpperCase().split("\\.");

        if(str.indexOf(split[0])>str.indexOf(split[1])){
            itr.remove();
        }
    }

     System.out.println(strList);


}

输出

[A.B, A.C]

答案 1 :(得分:0)

要反转字符串,我建议使用StringBuffer。

String sample = "ABC";
String reversed_sample = new StringBuffer(sample).reverse().toString();

要删除对象表单,ArrayList使用remove方法。

String sample = "ABC";String to_remove = "ADS";
ArrayList<String> list = new ArrayList<Sample>();
list.add(to_remove);list.add(sample );
list.remove(to_remove);

答案 2 :(得分:0)

您可以在O(n^2)时间内完成此操作。伪码:

For every element1 in the list:
     For every element2 in the list after element1:
         if reverse(element2).equals(element1)
             list.remove(element2)

为了让您的生活更轻松并防止ConcurrentModificationException使用Iterator。我不会给你代码,因为它是学习如何在Java中正确使用迭代器的一个很好的例子。

反向法:

public String reverse(String toReverse) {
    return new StringBuilder(toReverse).reverse().toString();
}

编辑:另一种反向方法:

public String reverse(String toReverse) {
     if (toReverse != null && !toReverse.isEmpty) {
         String[] elems = toReverse.split(".");
     }
     StringBuilder reversedString = new StringBuilder("");
     for (int i = elems.length - 1; i >= 0; i++) {
          reversedString.append(elems[i]);
          reversedString.append(".");
     }
     return reversedString.toString();
}

答案 3 :(得分:0)

您可以迭代列表,同时在其中保留Set<String>个元素。

当你这样做时 - 创建一个新列表(将是输出)和:

   if (!set.contains(current.reverse())) {
       outputList.append(current)
       set.add(current)
   }

此解决方案平均为O(n*|S|),其中n为元素数,|S|为平均字符串长度。

Java代码:

private static String reverse(String s) { 
    StringBuilder sb = new StringBuilder();
    for (int i = s.length()-1 ; i >=0 ; i--) { 
        sb.append(s.charAt(i));
    }
    return sb.toString();
}
private static List<String> removeReverses(List<String> arr) { 
    Set<String> set = new HashSet<String>();
    List<String> res = new ArrayList<String>();
    for (String s : arr) { 
        if (!set.contains(reverse(s))) {
            res.add(s);
            set.add(s);
        }
    }
    return res;
}
public static void main(String[]args){
    String[] arr = { "a.c" , "b.c", "c.a", "c.b" };
    System.out.println(removeReverses(arr));
}

将产生:

[a.c, b.c]

答案 4 :(得分:0)

您可以使用HashMap来确定字符串是否是列表中其他字符串的反转版本。并且您还需要一个实用程序函数来反转给定的字符串。看一下这个片段:

String[] input = { "A.B", "B.A", "A.C", "C.A" };
HashMap<String, String> map = new HashMap<String, String>();
String[] output = new String[input.length];
int index = 0;

for (int i = 0; i < input.length; i++) {
    if (!map.containsKey(input[i])) {
        map.put(reverse(input[i]), "default");
        output[index++] = input[i];
    }
}

示例字符串反转方法可以是这样的:

public static String reverse(String str) {
    String output = "";
    int size = str.length();
    for (int i = size - 1; i >= 0; i--)
        output += str.charAt(i) + "";
    return output;
}

<强>输出: 输出数组将包含这些元素=&gt; [A.B, A.C, null, null]

答案 5 :(得分:0)

代码值千言万......

public class Tes {

    public static void main(String[] args) {

        ArrayList<String> arr = new ArrayList<String>();
        arr.add("A.B");
        arr.add("B.A");
        arr.add("A.C");
        arr.add("C.A");

        System.out.println(arr);

        for (int i = 0; i < arr.size(); i++) {

            StringBuilder str = new StringBuilder(arr.get(i));

            String revStr = str.reverse().toString();

            if (arr.contains(revStr)) {

                arr.remove(i);

            }
        }

        System.out.println(arr);

    }

}