1

我有结构数组或列表字符串,例如:

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

我只想从列表中删除反向字符串:

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

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

4

6 回答 6

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]
于 2012-11-10T09:43:05.720 回答
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);

    }

}
于 2012-11-10T09:46:02.497 回答
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);
于 2012-11-10T09:34:43.637 回答
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();
}
于 2012-11-10T09:35:49.497 回答
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]
于 2012-11-10T09:40:56.610 回答
0

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

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;
}

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

于 2012-11-10T09:44:38.053 回答