Java中请将一个一维数组下标中,下标为1和3,5和7,9和11,13和15....的元素互换若最后只剩一个元素则无需交换

  一、泛型数组列表ArrayList
  1.在Java中,ArrayList类可以解决运行时动态更改数组的问题。ArrayList使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而不需要为此编写任何代码。
  对数组列表实施插入和删除操作效率比较低,对于小型数组来说可以接受。但是如果数组存储的元素数比较多,又经常需要在中间位置插入、删除元素,就应该考虑使用链表。
  ArrayList是一个采用类型参数(type parameter)的泛型类(generic class)。为了指定数组列表保存的元素对象类型,需要用一对尖括号将类名括起来加在后面。
  例如:构造和保存一个Employee对象的数组列表
ArrayList&Employee& staff = new ArrayList&&();
  2.ArrayList类的一些方法
  (1)使用add方法可以将元素添加到数组列表中中
staff.add(new Employee("Carl Cracker", 7, 12, 15));
  数组列表管理着对象引用的一个内部数组。最终,数组的全部空间有可能被用尽。这就显示出数组列表的优点:如果调用add方法且内部数组已经满了,数组列表就将自动地创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大的数组中。
  如果已经明确数组存储的元素的数量,可以在add前调用ensureCapacity方法:这个方法调用将分配一个包含100个对象的内部数组。
staff.ensureCapacity(100);
  也可以在构造数组列表的时候就指定初始容量:
ArrayList&Employee& staff = new ArrayList&&(100);
  (2)使用size方法将返回数组列表中包含的实际元素数目:打印结果:3
staff.add(new Employee("Carl Cracker", 7, 12, 15));
staff.add(new Employee("Harry Hacker", 5, 10, 1));
staff.add(new Employee("Tony Tester", 4, 3, 15));
System.out.println(staff.size());
  (3)使用trimToSize方法将存储区域的大小调整为当前元素数量所需要的存储空间数目,垃圾回收器将回收多余的存储空间。一旦整理了数组列表的大小,添加新元素就需要花时间再次移动存储块,所以应该在明确不会添加任何元素时,再调用这个方法。
staff.trimToSize();
  (4)使用get和set方法实现访问或改变数组列表中元素的操作:数组列表访问元素语法较为复杂
staff.set(i, Harry);
// 等价于对数组a的元素赋值:a[i] = Hstaff.get(i);
// 等价于获取数组a下标为i的元素:Employee e = a[i]
  (5)使用toArray方法将数组列表中的元素拷贝到一个数组中:常用的数组列表使用方法,既可以灵活地扩展数组,又可以方便地访问数组元素
// 第一步:创建一个数组列表,并添加所有的数组元素ArrayList&X& list = new ArrayList&&();
while(...){
list.add(x);}// 第二步:将数组列表中的元素拷贝到数组中便于访问X[] a = new X[list.size()];list.toArray(a)
  (6)使用带索引的add方法在数组列表的中间插入元素:
int n = staff.size()/2;
staff.add(n, e);
  (7)使用remove方法移除索引位置的元素并返回:
Employee e = staff.remove(n)
  (8)使用for each循环遍历数组列表:
for (Employee e : staff)
e.raiseSalary(5);
  3.类型化与原始数组列表的兼容性
  假如有下面这个没有使用类型参数的类:可以看到,这里的ArrayList没有使用泛型,如果和这些代码交互就会有一些问题。
public class EmplayeeDB{
public void update(ArrayList list){..}
public ArrayList find(String query){...}
  可以将一个类型化的数组列表传递给update方法,而不需要进行任何类型转换:即只要是ArrayList类对象,不管是什么具体类型化都可以编译通过。
ArrayList&Employee& staff = ...;
employeeDB.update(staff);
  但是,如果将一个原始的没有类型化的ArrayList赋值给一个类型化ArrayList就会得到警告:因为得到的可能不是Employee类的类型的数组列表
ArrayList&Employee& result = employeeDB.find(....);
  这个时候可以使用强制类型转换:这个时候会得到另外一个警告,因为虚拟机中没有类型参数
ArrayList&Employee& result = (ArrayList&Employee&)employeeDB.find(....);
  这个时候,如果确保不会造成严重的后果,可以使用@SuppressWarnings("unchecked")来标记这个变量能够接受类型转换:
@SuppressWarnings("unchecked")ArrayList&Employee& result = (ArrayList&Employee&)employeeDB.find(....);
  二、枚举类Enum
  1.没有构造器和方法的枚举类:在比较两个枚举类型的值时,永远不需要调用equals,而是直接使用“==”就可以了。
public enum Size (SMALL, MEDIUM, LARGE, EXTRA_LARGE};
  2.可以在枚举类型中添加构造器、方法和域,例如:
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");
  // 构造器
private Size(String abbreviation) { this.abbreviation = }  // 返回括号里面的字符(缩写)
public String getAbbreviation() { return }
  // 括号里面的字符(缩写)
  3.枚举类的一些方法:
  (1)toString方法能够将枚举对象转化成字符串并返回枚举常量名,例如:
System.out.println(Size.SMALL.toString());   // 打印:SMALL
  (2)valueOf方法能够根据枚举常量名返回枚举对象,例如:
Size s = Enum.valueOf(Size.class, "SMALL");
System.out.println(s.getAbbreviation());
  // 打印:S
  (3)values方法可以返回一个包含全部枚举值的数组,例如:
Size[] values = Size.values();
for (Size size : values)
System.out.print(size + " ");  // 打印:SMALL MEDIUM LARGE EXTRA_LARGE
  (4)ordinal方法返回enum声明中枚举常量的位置,例如:
System.out.println(Size.EXTRA_LARGE.ordinal()); // 打印:3
阅读(...) 评论()确定要删除当前文章?求数组中和为给定数的所有组合的个数
一、问题描述
给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合,例如t=4,n=6这6个数为[4,3,2,2,1,1],这样输出就有4个不同的组合它们的加和为4:4,3+1,2+2,and 2+1+1。请设计一个高效算法实现这个需求。
二、解题思路
先将数据按从小到大进行排序,然后使用回溯法遍历所有可能。注意去掉重复的结果。
三、Java代码实现
//--------------------- Change Logs----------------------
// &p&@author weiwei.han Initial Created at &p&
//-------------------------------------------------------
*求任意一个数组中所有和为给定数的组合个数
public class CombinationCount {
private static int count = 0;
private static int []array = {0, 9, 8, 3, 4, 1, 2, 7, 5, 6};
private static int sum = 8;
static int getCount() {
CombinationCount.quickSort(array, 0, array.length-1);
CombinationCount.sum(array.length-1);
static int[] sum(int n) {
if(n == 0){
return new int[]{array[0]};
int length = (int)Math.pow(2, (n+1))-1;
int a[] = new int[length];
int b[] = sum(n-1);
for(i=0; i&(length-1)/2; i++) {
a[i] = b[i];
int temp = b[i] + array[n];
if(temp == sum){
a[i+(length+1)/2] =
if(array[n] == sum) {
a[(length-1)/2] = array[n];
private static void quickSort(int []array, int left, int right) {
if(left &= right) {
int q = pagenation(array, left, right);
quickSort(array, left, q-1);
quickSort(array, q+1, right);
private static int pagenation(int []array, int left, int right) {
int i=left, j=right+1;
int p = (int)Math.random()*(right-left+1)+
swap(array,left, p);
int x = array[left];
while(true) {
while(i&right && array[++i] & x);
while(j&left && array[--j] & x);
if(i & j) {
swap(array,i,j);
private static void swap(int [] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] =
public static void main(String[] args) {
//CombinationCount.sum(array.length-1);
//System.out.println(CombinationCount.count);
System.out.println(CombinationCount.getCount());
在一个数组中找到等于某个数的组合
算法题:求指定数组中和为N的出现的所有组合(二)
C++寻找数组元素组合之和为给定数
阿里巴巴笔试题--求数组中和为给定数所有的组合
求数组中和为某一值的全部组合
和为给定数
第二十一题(求数组中和为特定数的所有组合)
java求子集和,给定数组求这个数组中某些数字相加等于某个值的所有可能集合
算法题:求一个数组中和为sum的所有组合
求整数数组中和最大的子数组的3种方法
没有更多推荐了,Java中List的排序 Comparable和 Compartor
第一种方法,就是list中对象实现Comparable接口,代码如下:
class Person implements
Comparable&Person& {
* @return the name
String getName() {
* @param name
the name to set
void setName(String name) {
this.name =
* @return the order
Integer getOrder() {
* @param order
the order to set
void setOrder(Integer order) {
this.order =
int compareTo(Person arg0) {
this.getOrder().compareTo(arg0.getOrder());
static void
main(String[] args) {
List&Person& listA =
new ArrayList&Person&();
Person p1 =
new Person();
Person p2 =
new Person();
Person p3 =
new Person();
p1.setName("name1");
p1.setOrder(1);
p2.setName("name2");
p2.setOrder(2);
p3.setName("name3");
p3.setOrder(3);
listA.add(p2);
listA.add(p1);
listA.add(p3);
Collections.sort(listA);
(Person p : listA) {
System.out.println(p.getName());
第二种方法,就是在重载Collections.sort方法,代码如下:
class Person {
* @return the name
String getName() {
* @param name
the name to set
void setName(String name) {
this.name =
* @return the order
Integer getOrder() {
* @param order
the order to set
void setOrder(Integer order) {
this.order =
static void
main(String[] args) {
List&Person& listA =
new ArrayList&Person&();
Person p1 =
new Person();
Person p2 =
new Person();
Person p3 =
new Person();
p1.setName("name1");
p1.setOrder(1);
p2.setName("name2");
p2.setOrder(2);
p3.setName("name3");
p3.setOrder(3);
listA.add(p2);
listA.add(p1);
listA.add(p3);
Collections.sort(listA,
new Comparator&Person&() {
int compare(Person arg0, Person arg1) {
arg0.getOrder().compareTo(arg1.getOrder());
(Person p : listA) {
System.out.println(p.getName());
两次执行的结果都是:
对于Comparator和Compartor:
使用Compartor接口实现排序:实现其compare()方法,根据第一个参数小于、等于或大于第二个参数分别返回负整数、零
或正整数来判断大小。强行对某个对象 collection进行整体排序的比较函数。可以将Comparator传递给sort方法(如 Collections.sort
huo Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Compartor来控制某些数据结构(如 有序set或有序映射)的顺序,
或者为那些没有自然顺的对象collection提供排序。
使用Comparable接口完成排序: 实现此接口的对象列表(和数组)可以通过Collecitons.sort(和Array.sory)进行自动排序。实现此接口
的对象可以用作有序映射中的键或有序集合中的元素,无序指定比较器。
二者的区别:
1:Comparable是在集合内部定义的方法实现的排序,Compartor实在集合歪脖实现的排序
2: 一个类实现了Comparable接口则表明这个类的对象之间是可以互相比较的,这个类对象组成的集合就可以直接使用sort方法排序。一般
我们写的bean都要实现这一接口,这也是标准javabean的规范。
3:Comparator可以看成一种算法的实现,讲算法和数据分离,Compartor也可以在下面两种环境汇总使用:
类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2)可以使用多种排序标准,比如升序、降序等。
Java排序对象Comparable和Compartor
Java 比较器Comparable和Compartor的使用
java中compartor的使用方法
Java集合(上)
Java集合排序方法comparable和comparator的总结
【java】Comparator的用法
JAVA 利用Comparator实现自定义排序
JAVA集合(一)
没有更多推荐了,已知一个数组{1,3,5,7,9,11,13,15},求?+?+?=30。用java写出程序_百度知道
已知一个数组{1,3,5,7,9,11,13,15},求?+?+?=30。用java写出程序
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
lionheart1988知道合伙人
来自电脑网络类芝麻团
lionheart1988
采纳数:2001
获赞数:2924
擅长:暂未定制
参与团队:
这题很简单,但是仔细看下题干就能知道这题是无解的,数组中的数都是奇数,奇数+奇数+奇数结果肯定还是奇数,不可能等于30 的代码我贴在下面了,执行结果可以证实,是无解的public class Test{
public static void main(String[] args)
int[] values = {1, 3, 5, 7, 9, 11, 13, 15};
for (int i : values)
for (int j : values)
for (int k : values)
if (i + j + k == 30)
System.out.println(i + &+& + j + &+& + k + & = 30&);
yzq知道合伙人
来自电脑网络类芝麻团
采纳数:13
获赞数:18
擅长:暂未定制
参与团队:
int&[]&array&=&new&int[]{1,3,5,7,9,11,13,15};
for&(int&i&=&0;&i&&&array.&i++)&{
int&a&=&array[i];
for&(int&j&=&i;&j&&&array.&j++)&{
int&b&=&array[j];
for&(int&j2&=&j;&j2&&&array.&j2++)&{
if(i!=j2&&j!=j2){
int&c&=&array[j2];
if(a+b+c==30){
System.out.println(i+&-&+j+&-&+j2);
}你给的数组,没有结果!
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 一维数组的下标从什么开始 的文章

 

随机推荐