归类为变量的内容有点模棱两可(我相信整数和迭代器都是变量,但大多数其他答案似乎不同意),我假设它是任何需要声明的东西,即超出了单个语句的范围(整数,迭代器, element, 不管)(所以你可以get(i).equals(...)
不将它分类为变量,但如果你这样做var = get(i); var.equals(...)
,那将是一个变量)。
下面假设重复的元素一个接一个,我们将重复分类为恰好出现 2 次。4 次出现将分类为 2 对重复,6 次分类为 3 对,依此类推。
static String findUnique(Iterable<String> collection)
{
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext())
{
String s = iterator.next();
if (!iterator.hasNext() || !s.equals(iterator.next()))
return s;
}
return null;
}
可以使用以下方式运行:
List<String> myList = Arrays.asList("abcd", "xyz", "xyz", "pqrs", "pqrs");
System.out.println(findUnique(myList));
现在从技术上讲s
是另一个变量,但它是迭代的本地变量,所以它可能没问题。否则,修改Iterator
和添加getNextWithoutIncrement()
函数将允许您删除s
if 语句并将其更改为:
if (!iterator.getNextWithoutIncrement().hasNext() ||
iterator.next().equals(iterator.next()))
如果重复的元素没有一个接一个,这就有点问题了。我知道的每个排序算法都使用多个变量(甚至是冒泡排序,也有两个变量)。但是,如果您被允许修改列表,则可以使用修改后的类似冒泡排序的过程,如下所示:
static String findUnique(List<String> collection)
{
while (collection.size() > 0)
{
int i;
for (i = 0; i < collection.size()-1; i++)
if (collection.get(i).equals(collection.get(i+1)))
break;
else
{
String s = collection.get(i);
collection.set(i,collection.get(i+1));
collection.set(i+1,s);
}
if (i == collection.size()-1)
return collection.get(collection.size()-1);
else
{
collection.remove(i);
collection.remove(i);
}
}
return null;
}
致电:
List<String> myList= new ArrayList<String>(Arrays.asList("xyz", "abcd", "xyz", "pqrs", "pqrs"));
System.out.println(findUnique(myList));
nowremove
可能不允许,但应该可以通过更改i
为Iterator
具有附加getNextWithoutIncrement
功能的 an 来实现。
又s
是另一个变量,但它又是迭代的局部变量,所以它可能没问题。这是 swap 的一个 hacky 替代方法(假设 String 不包含|
):
collection.set(i, collection.get(i+1) + "|" + collection.get(i));
collection.set(i+1, collection.get(i).substring(collection.get(i).indexOf("|") + 1));
collection.set(i, collection.get(i).substring(0, collection.get(i).indexOf("|")));