所以我试图创建一个for循环来查找ArrayList
中的唯一元素。
我已经存储了ArrayList
用户输入20个位置(允许重复)但我仍然坚持如何计算列表中输入的不同位置的数量,不包括重复项。 (我想避免使用哈希)
输入:
[park, park, sea, beach, town]
输出:
[Number of unique places = 4]
以下是我试图制作的代码的一个粗略示例:
public static void main(String[] args) {
ArrayList<City> place = new ArrayList();
Scanner sc = new Scanner(System.in);
for(...) { // this is just to receive 20 inputs from users using the scanner
...
}
# This is where i am lost on creating a for loop...
}
答案 0 :(得分:4)
您可以使用Set。 https://docs.oracle.com/javase/7/docs/api/java/util/Set.html
将列表数据存储到Set
。Set
中不会有重复项,因此set的大小将是没有重复项的元素。
使用此方法获取设置大小。 https://docs.oracle.com/javase/7/docs/api/java/util/Set.html#size()
示例代码。
List<String> citiesWithDuplicates =
Arrays.asList(new String[] {"park", "park", "sea", "beach", "town"});
Set<String> cities = new HashSet<>(citiesWithDuplicates);
System.out.println("Number of unique places = " + cities.size());
答案 1 :(得分:2)
如果您能够使用Java 8,则可以使用Java流的distinct
方法:
int numOfUniquePlaces = list.stream().distinct().count();
否则,使用集合是最简单的解决方案。由于您不想使用&#34; hash&#34;,请使用TreeSet
(尽管HashSet
在大多数情况下是更好的解决方案)。如果这也不是一个选项,那么您必须手动检查每个元素是否重复。
答案 2 :(得分:1)
如果您不想使用Set
或Map
接口的实现(这可以解决您的一行代码问题)并且您希望坚持ArrayList
,我建议使用Collections.sort()
方法之类的东西。它会对你的元素进行排序。然后遍历排序的数组并比较和计算重复项。这个技巧可以让您更轻松地解决迭代问题。
无论如何,我强烈建议使用Set
接口的一个实现。
答案 3 :(得分:1)
想到的一种方法(不使用Set
或哈希值)是制作第二个列表。
ArrayList<City> places = new ArrayList<>();
//Fill array
ArrayList<String> uniquePlaces = new ArrayList<>();
for (City city : places){
if (!uniquePlaces.contains(city.getPlace())){
uniquePlaces.add(city.getPlace());
}
}
//number of unique places:
int uniqueCount = uniquePlaces.size();
请注意,这不是超级效率= D
答案 4 :(得分:0)
使用以下答案。如果有多个重复元素,这将在不同列表中添加最后一个重复元素。
List<String> citiesWithDuplicates = Arrays.asList(new String[] {
"park", "park", "sea", "beach", "town", "park", "beach" });
List<String> distinctCities = new ArrayList<String>();
int currentIndex = 0;
for (String city : citiesWithDuplicates) {
int index = citiesWithDuplicates.lastIndexOf(city);
if (index == currentIndex) {
distinctCities.add(city);
}
currentIndex++;
}
System.out.println("[ Number of unique places = "
+ distinctCities.size() + "]");
答案 5 :(得分:0)
好吧,如果你不想使用任何HashSets或类似的选项,这样的快速和脏的嵌套for循环就可以了(如果你有很多项目,那就太慢了)很好)):
int differentCount=0;
for(City city1 : place){
boolean same=false;
for(City city2 : place){
if(city1.equals(city2)){
same=true;
break;
}
}
if(!same)
differentCount++;
}
System.out.printf("Number of unique places = %d\n",differentCount);