需求:
有一个从小到大排序的int型数据集,可以定义数据集显示的顺序,即规则。
例如:
int [] iArray = {10,20,30};
String rule = "3,2,1";
//该规则意思是,第1个显示,数据集中第3个数据
第2个显示,数据集中第2个数据
第2个显示,数据集中第2个数据
显示结果:30,20,10
需求1:
数据集中数据可能被第三方删除,但删除数据时,由于种种原因,无法删除规则中相关内容。但要求数据集内数据被删除时,还能按照规则正确显示。
例如:
上例iArray中20被删除,数据集变为 {10,30};
规则仍然是:String rule = "3,2,1";
希望显示结果为:30,10需求2:
数据集可能被第三方改变,但是仍是从小到大排列,改变后和改变前数据一一对应,但要求数据集被改变时,还能按照规则正确显示。
例如:
上例数据集变为 {10,30}后,被第三方改变,变为{100,300},10对应100,30对应300
规则仍然是:String rule = "3,2,1";
希望显示结果为:300,100注:需求2,3可能同时出现,即数据集被删除后,又被该改变
public class adfadf { public static void main(String[] args) { int[] iArray = { 10, 20, 30 };
String order = "3,2,1";
order(iArray, order); int[] iArray2 = { 10, 30 };// 数据集变为,10,30
order = "3,2,1";// 规则不变
// 希望显示结果为:30,10 int[] iArray3 = { 100, 300 };// 被第三方改变,变为{100,300},10对应100,30对应300
order = "3,2,1";// 规则不变
// 希望显示结果为:300,100
} public static void order(int[] iArray, String order) {
for (String o : order.split(","))
System.out.println(iArray[Integer.parseInt(o) - 1]);
} public static void order2(int[] iArray, String order) {
// .................
// 希望显示结果为:30,10
} public static void order3(int[] iArray, String order) {
// .................
// 希望显示结果为:300,100
}
}
有一个从小到大排序的int型数据集,可以定义数据集显示的顺序,即规则。
例如:
int [] iArray = {10,20,30};
String rule = "3,2,1";
//该规则意思是,第1个显示,数据集中第3个数据
第2个显示,数据集中第2个数据
第2个显示,数据集中第2个数据
显示结果:30,20,10
需求1:
数据集中数据可能被第三方删除,但删除数据时,由于种种原因,无法删除规则中相关内容。但要求数据集内数据被删除时,还能按照规则正确显示。
例如:
上例iArray中20被删除,数据集变为 {10,30};
规则仍然是:String rule = "3,2,1";
希望显示结果为:30,10需求2:
数据集可能被第三方改变,但是仍是从小到大排列,改变后和改变前数据一一对应,但要求数据集被改变时,还能按照规则正确显示。
例如:
上例数据集变为 {10,30}后,被第三方改变,变为{100,300},10对应100,30对应300
规则仍然是:String rule = "3,2,1";
希望显示结果为:300,100注:需求2,3可能同时出现,即数据集被删除后,又被该改变
public class adfadf { public static void main(String[] args) { int[] iArray = { 10, 20, 30 };
String order = "3,2,1";
order(iArray, order); int[] iArray2 = { 10, 30 };// 数据集变为,10,30
order = "3,2,1";// 规则不变
// 希望显示结果为:30,10 int[] iArray3 = { 100, 300 };// 被第三方改变,变为{100,300},10对应100,30对应300
order = "3,2,1";// 规则不变
// 希望显示结果为:300,100
} public static void order(int[] iArray, String order) {
for (String o : order.split(","))
System.out.println(iArray[Integer.parseInt(o) - 1]);
} public static void order2(int[] iArray, String order) {
// .................
// 希望显示结果为:30,10
} public static void order3(int[] iArray, String order) {
// .................
// 希望显示结果为:300,100
}
}
加入可以认为高位被删,则String[] orders = order.split(",");
for (String o : orders) {
int io = Integer.parseInt(o);
if (io < iArray.length) {
System.out.println(iArray[io - 1]);
}
}如果这个假设不成了,我认为这个程序就没法儿写了。
比如排序是3, 1, 2。可是你只有两个元素。
三种情况结果
认为删除元素是第一个 30, 10
认为是第二个 30,10
认为是第三个 则变成了 10, 30
String rules = "3,2,1";
int[] array = {10,20,30};
String[] rule = rules.split(",");
for(int i=0;i<rule.length;i++){
System.out.print(array[Integer.parseInt(rule[i])-1]+",");
}
int[] iArray1={10,20,30};
String order1 = "3,2,1"; int[] iArray2={10,30};
String order2 = "3,2,1";
int[] iArray3={100,300};
String order3 = "3,2,1";
System.out.print("完整数组: ");
order(iArray1,order1);
System.out.print("数据集变为{10,30}: ");
order(iArray2,order2);
System.out.print("数据集变为{100,300}: ");
order(iArray3,order3); } public static void order(int[] iArray, String order) {
for (String o : order.split(","))
{
int index=Integer.parseInt(o);
if(iArray.length<index)
continue;
System.out.print(iArray[index-1]+",");
}
System.out.println();
}
2。不管你是XML文件还是数据库表存储这些数据也好 建议提供主键约束,而规则也使用主键排序就类似于 学生排序号后 删除了部分学生信息或是学生的年龄发生了变化 这个不会影响到排序结果
3.还没想到
public static int[] order(int[] iArray, final String order) {
int[] sortAsOrder = new int[iArray.length];
int i = 0;
for (String o : order.split(",")){
try{
sortAsOrder[i] = iArray[Integer.parseInt(o) - 1];
++i;
}catch(ArrayIndexOutOfBoundsException e){
continue;
}catch (Exception e){
e.printStackTrace();
}
}
return sortAsOrder;
}
int[] iArray = { 10, 20, 30 };
String order = "3,2,1";
int[] rArray={ 0, 0, 0}
int[] rOrder={ 0, 0, 0}
String[] iOrder=order.split(",");
for(int i=0;i<iArray.length;i++)rArray[i]=iArray[Integer.parseInt(iOrder[i])-1];
for(int i=0;i<rArray.length;i++)
for(int j=0;j<iArray.length;j++)if(rArray[i]==iArray[j])rOrder[i]=j+1
int rules=1;
int[] iArray2 = { 10, 30 };
order(iArray,iArray2,rArray,rOrder,rules);
rules=10;
int[] iArray3 = { 100, 300 };
order(iArray,iArray3,rArray,rOrder,rules);
}
public static void order(int[] pArray, int[] iArray, int[] rArray, int[] order, int rules) {
for(int i=0;i<rArray.length;i++)
for(int j=0;j<iArray.length;j++)
if(rArray[i]==iArray[j]* rules)System.out.println(pArray[order[j]-1]* rules);
}
JAVA为什么放弃指针呢........
楼主的数据是理想数据,我写的这个
无论你的规则是什么,无论数据仓库变成什么,都会按规则输出,只要调用order2
比如:
int [] iArray = {150,50,380};
String rule = "1,3,2";
则输出50,380,150
然后数据被删除,iArray = {150,380};
rule不变
则输出150,380
其实,如果条件比较丰富,比如数据只是int,那11楼的方案1也是不错的import java.util.*;public class Rule { public static String String_order[]=null;
public static int Int_order[]=null;
public static void main(String[] args) { int[] iArray = { 10, 30, 20 };
String order = "3,2,1";
order2(iArray, order); int[] iArray2 = { 10, 30 };// 数据集变为,10,30
order = "3,2,1";// 规则不变
order2(iArray2,order);
// 希望显示结果为:30,10 int[] iArray3 = { 100, 300 };// 被第三方改变,变为{100,300},10对应100,30对应300
order = "3,2,1";// 规则不变
order2(iArray3,order);
// 希望显示结果为:300,100
} public static void order(int[] iArray, String order) {
for (String o : order.split(","))
System.out.println(iArray[Integer.parseInt(o)-1]);
} public static void order2(int[] iArray, String order) {
// .................
// 希望显示结果为:30,10
Map con = new HashMap();
StringBuffer s = new StringBuffer();
String_order=order.split(",");
int x =iArray.length;
Int_order = new int[x];
for(int i=0;i<x;i++){
Int_order[i]=Integer.parseInt(String_order[i]);
con.put(Int_order[i],i);
}
Arrays.sort(Int_order);
Arrays.sort(iArray);
for(int i=0;i<x;i++){
//System.out.println(i);
s.append(con.get(Int_order[i]));
if(i!=x-1){
s.append(",");
}
}
String orderResult = new String(s);
//System.out.println(orderResult);
for (String o : orderResult.split(",")){
System.out.println(iArray[Integer.parseInt(o)]);
} } public static void order3(int[] iArray, String order) {
// .................
// 希望显示结果为:300,100
}
}
有一个从小到大排序的int型数据集,可以定义数据集显示的顺序,即规则。
你的扩展为什么不是这样的: Object[] iArray = ....
楼主的确说了:有一个从小到大排序的int型数据集
那我扩展到:任意混乱排序的int型数据集
难道有什么问题?你居然反问我为什么不用object,那我问你,你怎么回帖不用机器语言啊
对于你13楼的代码,你看过楼主的前2个帖子吗?有些规则是164532,要求输出结果集,楼主可没有说过,规则是一定降序,请你发言前仔细看下之前的帖子
/** ~~~~~~~~~~~~~郁闷
*/
public class Main { public static void main(String[] args) throws Exception {
//需求:
Integer[] iArray = {10, 20, 30};
String rule = "3,2,1";
OrderList ol = new OrderList(getTemp(rule), iArray);
System.out.println(ol);//结果:{30,20,10}
System.out.println(); //需求1:
ol.remove(1);
System.out.println(ol);//结果:{30,10}
System.out.println(); //需求2
Integer b2 = (Integer) ol.getValue(0);
ol.setValue(((Integer) ol.getValue(1)) * 10, 0);
ol.setValue(b2 * 10, 1);
System.out.println(ol);//结果:{300,100}
System.out.println();
ol.setValue(new Integer[]{100,300,900});//结果:{900,300,100}
System.out.println(ol);
} static int[] getTemp(String order) {
String[] orders = order.split(",");
int[] iArray = new int[orders.length];
int i = 0;
for (String o : orders) {
iArray[i++] = Integer.parseInt(o);
}
return iArray;
}
}/**
* 存放的最大容量为初始化时规则int[] order的个数
* @author Administrator
* @param <V>
*/
final class OrderList<V extends java.lang.Comparable>/* implements IsMeList, java.io.Serializable */ { /**
* 数据,升序
*/
java.lang.Comparable[] tem;
/**
* 数据长度
*/
int len;
/**
* 排序规则,每个数 > 0
*/
int[] order; public OrderList(int[] order) throws Exception {
this(order, null, -1, -1);
} public OrderList(V[] v) throws Exception {
this(getOrder(v), v);
} public OrderList(int[] order, V[] v) throws Exception {
this(order, v, 0, v.length);
} public OrderList(int[] order, V[] t, int s, int len) throws Exception {
if (order == null || order.length < 1) {
throw new Exception("is not null");
}
if (t == null || t.length < 1 || s < 0 || len < 0 || s > t.length - 1 || s + len > t.length || len > order.length) {
this.len = 0;
this.order = new int[order.length];
System.arraycopy(order, 0, this.order, 0, order.length);
tem = new java.lang.Comparable[order.length];
} else {
this.len = len;
this.order = new int[order.length];
System.arraycopy(order, 0, this.order, 0, order.length);
tem = new java.lang.Comparable[order.length];
if (t != null && t.length > 0) {
System.arraycopy(t, s, tem, 0, len);
java.util.Arrays.sort(tem);//排序
}
for (int i = 0, im = order.length; i < im; i++) {
this.order[i]--;
}
}
} private void setOrder() {
} public boolean isEmpty() {
return order == null || len == 0;
} public boolean isFill() {
return order != null && len == order.length;
} public int length() {
return len;
} /**
* 添加
* @param v
*/
public synchronized void add(V v) throws Exception {
if (v == null || isFill()) {
throw new Exception("is null or fill");
}
tem[len] = v;
for (int i = len; i > 0; i--) {
if (tem[i].compareTo(tem[i - 1]) < 1) {
java.lang.Comparable b = tem[i];
tem[i] = tem[i - 1];
tem[i - 1] = b;
} else {
break;
}
}
len++;
} /**
* 修改值
* @param v
* @param index
* @throws java.lang.Exception
*/
public synchronized void setValue(V v, int index) throws Exception {
if (index < 0 || index + 1 > len || v == null) {
throw new Exception("is or over tem len");
}
int[] neworder = getNewOrder();
tem[neworder[index]] = v;
java.lang.Comparable c[] = new java.lang.Comparable[len];
System.arraycopy(tem, 0, c, 0, len);
java.util.Arrays.sort(c);
System.arraycopy(c, 0, tem, 0, len);
} public int indexof(V v) throws Exception {
return indexof(v, 0);
} /**
* 从index位置开始查找v的位置
* @param v
* @param index
* @return
* @throws java.lang.Exception
*/
public int indexof(V v, int index) throws Exception {
if (index < 0 || index + 1 > len || v == null) {
throw new Exception("is or over tem len");
}
int[] neworder = getNewOrder();
for (int i = index, im = len; i < len; i++) {
if (v.equals(tem[neworder[i]])) {
return i;
}
}
return -1;
} /**
* 删除第index个
* @param index
* @return
*/
public synchronized V remove(int index) {
int[] neworder = getNewOrder();
V v = (V) tem[neworder[index]];
for (int i = neworder[index]; i < len - 1; i++) {
tem[i] = tem[i + 1];
}
len--;
return v;
} /**
* 设置值
* @param v
* @throws java.lang.Exception
*/
public synchronized void setValue(V[] v) throws Exception {
if (v == null || v.length < 1 || v.length > order.length) {
throw new Exception("is not null or over tem");
}
java.lang.Comparable[] c = new java.lang.Comparable[v.length];
System.arraycopy(v, 0, c, 0, v.length);
java.util.Arrays.sort(c);//排序
System.arraycopy(c, 0, tem, 0, v.length);
len = v.length;
} public V getValue(int index) throws Exception {
if (index < 0 || index > len) {
throw new Exception("is not null or over tem");
}
return (V) tem[getNewOrder()[index]];
} /**
* 得到排序规则
* @return
*/
public int[] getOrder() {
int[] o = new int[order.length];
System.arraycopy(order, 0, o, 0, order.length);
for (int i = 0; i < order.length; i++) {
o[i]++;
}
return o;
} /**
* 返回 现有数据长度的排序规则
* @return
*/
private int[] getNewOrder() {
int[] neworder = new int[len];//除最高位的新规则
for (int i = 0, j = 0, b = 0; i < len; i++) {
while ((b = order[j++]) >= len) {//去高位
}
neworder[i] = b;
}
return neworder;
} /**
* 得到存储的值
* @return
*/
public V[] getStorValue() {
Object[] o = new Object[len];
System.arraycopy(tem, 0, o, 0, len);
return (V[]) o;
} @Override
public String toString() {
String str = "规则:{";
int[] neworder = getNewOrder();
int im = len;
for (int i = 0, ii = order.length; i < ii; i++) {
str += (order[i] + 1);
if (i < ii - 1) {
str += ",";
}
}
str += "},实际用到的规则:{";
for (int i = 0; i < im; i++) {
str += (neworder[i] + 1);
if (i < im - 1) {
str += ",";
}
}
str += "}\n结果:{";
for (int i = 0; i < im; i++) {
str += tem[neworder[i]].toString();
if (i < im - 1) {
str += ",";
}
}
return str + "}";
} @Override
public OrderList<V> clone() {
OrderList ol = null;
try {
ol = new OrderList(this.order, (V[]) tem);
} catch (Exception ex) {
Logger.getLogger(OrderList.class.getName()).log(Level.SEVERE, null, ex);
}
return ol;
} /**
* 得到规则为order 内容为this
* @param order
* @return
*/
public OrderList<V> getOrderList(int[] order) {
OrderList ol = null;
try {
ol = new OrderList(order, (V[]) tem);
} catch (Exception ex) {
Logger.getLogger(OrderList.class.getName()).log(Level.SEVERE, null, ex);
}
return ol;
} /**
* 得到v的排序规则
* @param v
* @return
*/
public static <V extends java.lang.Comparable<V>> int[] getOrder(V[] v) {
if (v == null || v.length < 1) {
return null;
}
Comparable[] ct = new Comparable[v.length];
System.arraycopy(v, 0, ct, 0, v.length);
java.util.Arrays.sort(ct);
int[] or = new int[v.length];
for (int i = 0; i < v.length; i++) {
for (int j = 0; j < v.length; j++) {
if (v[i].equals(ct[j])) {
or[i] = j /*+ 1*/;
break;
}
}
}
return or;
}
}
:{100,300},规则仍为:"2,1,3",那么结果要显示成什么?
要显示成100,300就知道变化的数会跟以前的数一一对应。也是按照从小到大排列。
例如:
上例数据集变为 {10,30}后,被第三方改变,变为{100,300},10对应100,30对应300
规则仍然是:String rule = "3,2,1";
希望显示结果为:300,100