1. 程式人生 > >Java中如何實現結構體?如何對結構體進行排序?

Java中如何實現結構體?如何對結構體進行排序?

***今天在做老師佈置的程式設計題時,遇到了本題。感覺這道題如果用C++來解決的話,用結構體比較好吧!哈哈哈,可能還有其他的好方法,但我目前想到的是用結構體來解決比較合理。Java中有結構體嗎?如果有,它是如何實現的呢?例項和解決方法見下。(前面是Java中有關結構體的一些知識點,後面是舉一個例項和解決程式碼)***


C/C++裡面的結構體在儲存(同類型或不同型別的成組的)資料的時候很方便,但是在Java中沒有Struct,但是我們可以用類來實現Struct的功能。然後建立類的物件陣列,就可以像操作C/C++中的結構體那樣,對其進行比較排序,讀寫值等等操作,還是很方便的。

其中,用類實現結構體並對其進行操作時,其實是有兩種方式可選的:

方式一:

把要儲存的資料設為私有變數,然後另寫函式對其進行讀寫,set()和get()

public  class Test
{
    private int x;
    private int y;
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}

方式二:

把要儲存的資料設為public變數,在其他主函式類中直接訪問修改。

class Supply implements Comparable<Supply>{
	int number;
	int max;
	int spend;
}

方式二雖然更簡單,但是封裝性不好,適合解決簡單問題。總之,各有各的好處!

介紹完了用類實現結構體,下面就介紹一下如何對類實現的結構體的物件陣列進行自定義排序。

定義一個(結構體)類實現Comparable介面,然後在類中重寫compareTo()方法(自定義排序哦),最後用Arrays.sort()進行排序。

import java.util.*;  

class S implements Comparable<S>  
{  
    int x,y;  
    public S(int x ,int y) {
        this.x = x;
        this.y = y;
    }
    public int compareTo(S a)  
    {    
        if(this.x-a.x != 0)   
        return this.x-a.x;  //按x升序排序
        else return this.y-a.y;  //如果x相同,按y升序排序
    } 
  }   public class Test {         public static void main(String args[])       {           Scanner in=new Scanner (System.in);           int n,i;           n=in.nextInt();        S d[] = new S[10];           for(i=0; i<n; i++)           {               int k1 = in.nextInt();             int k2 = in.nextInt();             d[i] = new S(k1,k2);                 }           Arrays.sort(d, 0, n); //排n個數,Arrays.sort(d)則預設排全部           for(i=0; i<n; i++)               System.out.println(d[i].x+" "+d[i].y);     }   }

執行結果:

3
4 5
2 4
2 3
2 3
2 4
4 5


【問題描述】

有n個某種商品供應商,某地有m個商店,商店需要從供應商那裡進貨該商品,每個供應商的供應能力有上限,每個商店都有自己的商品需求量(need[i]:表示第i個商店的需求),每個供應商運送單位商品到商店需要一個運費。

【輸入形式】

輸入說明:第一行包含兩個整數N,M

接下來N行包含三個整數,第一個數表示供應商編號,第二數表示供應能力上限,表示該供應商的供應量不能超過這個上限,第三個數表示運送單位商品到商店的運費。

接下來M行包含兩個整數,第一個數表示商店編號,第二個數表示某種商品的需求量。


【輸出形式】

輸出說明:若可以滿足所有商店需求,則輸出格式如下:每行第一個數表示供應商編號,第二個數為商店編號,第三個數為供應量。

如:1 2 20

表示第1個供應商給第2個商店供應20個單位量的商品

按商店編號順序,輸出所有供應路徑(最後一行無換行符)。

若不滿足,輸出-1(題目有毒,根據測試用例,應該是按照運費少的先供應,而且只用輸出最少運費的供應方案即可)


【樣例輸入】

4 4

0 20 8

1 15 3

2 55 6

3 40 10

0 28

1 36

2 49

3 12


【樣例輸出】

1 0 15

2 0 13

2 1 36

2 2 6

0 2 20

3 2 23

3 3 12

解題程式碼見下:

package homework5;

import java.util.*;

class Supply implements Comparable<Supply>{
	int number;
	int max;
	int spend;
	public Supply(int n,int m,int s) {
		this.number=n;
		this.max=m;
		this.spend=s;
	}
	public int compareTo(Supply s) {
		return this.spend-s.spend;
	}
}

public class Main5 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Supply []s = new Supply[100];
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int a1[] = new int[n];
		int a2[] = new int[n];
		int a3[] = new int[n];
		int b1[] = new int[m];
		int b2[] = new int[m];
		int sum1=0;
		int sum2=0;
		for(int i=0;i<n;i++) {
			a1[i]=sc.nextInt();
			a2[i]=sc.nextInt();
			a3[i]=sc.nextInt();
			s[i]=new Supply(a1[i],a2[i],a3[i]);
			sum1+=a2[i];
		}
		for(int i=0;i<m;i++) {
			b1[i]=sc.nextInt();
			b2[i]=sc.nextInt();
			sum2+=b2[i];
		}
		if(sum1<sum2) {
			System.out.println("-1");
		}
		else {
			Arrays.sort(s,0,n);
//			for(int i=0;i<n;i++) {
//				System.out.println(s[i].number+" "+s[i].max+" "+s[i].spend);
//			}
			int i=0,j=0;
			while(j!=m) {
				while(b2[j]!=0) {
					if(s[i].max<=b2[j])
					{
						b2[j]-=s[i].max;
						System.out.println(s[i].number+" "+b1[j]+" "+s[i].max);
						i++;
					}
					else {
						s[i].max-=b2[j];
						System.out.println(s[i].number+" "+b1[j]+" "+b2[j]);
						j++;
						if(j==m)
							break;
					}
				}
			}
		}
	}
}

執行結果:

4 4

0 20 8

1 15 3

2 55 6

3 40 10

0 28

1 36

2 49

3 12
1 0 15
2 0 13
2 1 36
2 2 6
0 2 20
3 2 23
3 3 12

總之,記兩點:一,Java中想用結構體的話,就寫個類來實現唄!二,要想對生成的物件陣列進行排序,就在類中實現Comparable介面並在類中自定義compareTo()比較函式,用Arrays.sort()進行排序就好啦!

注:當然排序方法肯定不止這一種,但這一種是本人目前認為最簡單的排序方法啦。哈哈哈,革命尚未成功,同志仍需努力呀!!!