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()進行排序就好啦!
注:當然排序方法肯定不止這一種,但這一種是本人目前認為最簡單的排序方法啦。哈哈哈,革命尚未成功,同志仍需努力呀!!!