我有结构数组或列表字符串,例如:
{ "A.B", "B.A", "A.C", "C.A" }
我只想从列表中删除反向字符串:
{ "A.B", "A.C" }
类型字符串如何使用以及如何删除反向字符串?
检查这个
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]
一个代码胜过千言万语......
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);
}
}
要反转字符串,我建议使用 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);
您可以非常简单地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();
}
您可以迭代列表,同时在其中维护一个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]
您可以使用 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]