如何在 hyperledger fabric 中对数组进行排序?
How to sort an array in hyperledger fabric?
我正在开发一个项目,该项目有 "coinWallet" 资产,其中有一系列硬币。我想按升序和降序对这些硬币进行排序(排列),我尝试使用冒泡排序算法但它不起作用,我不知道为什么。
这是我的模型文件
namespace com.libyan.coin.network
abstract participant User identified by id {
o String id
o String name
}
participant Bank extends User {
o String swift optional
o BankType bankType optional
o Boolean Validator
}
participant Company extends User {
--> Bank bankID
}
participant Customer extends User {
--> Bank bankID
}
participant Issuer extends User {
o String swift optional
}
enum BankType {
o CommercialBank
}
asset CoinWallet identified by id {
o String id
o Double amount
--> User owner
o CoinTransaction[] Coins optional
o String LstCoin optional
}
concept CoinTransaction {
o Double amount
o CoinTransactionType type
o String CoinId optional
o String prvCoin optional
o Integer index optional
o Boolean Spent
}
enum CoinTransactionType {
o ISSUE
o SEND
o RECEIVE
}
transaction IssueCoin {
--> CoinWallet coinWallet
o Double amount
}
transaction TransferCoin {
--> CoinWallet sender
--> CoinWallet receiver
o Double amount
o String CoinId optional
}
event TransactionCompleted {
o String msg
}
transaction InitCustomer{}
transaction InitBank{
这是我的脚本
function onTransferCoin(transaction) {
spentvalidation(transaction.Spent)
if (transaction.sender.amount < transaction.amount) {
throw new Error('Insufficient fund')
}
if (transaction.sender ==transaction.receiver) { ///sender and reciver can't be the same
throw new Error('You can not send money from ur wallet to ur wallet')
}
var coinWallet=transaction.sender
transaction.sender.amount -= transaction.amount
transaction.receiver.amount += transaction.amount
var n=coinWallet.Coins.length
var LastCoin=coinWallet.Coins.length-1
var swapp;
do {
swapp = false;
for (var i=0; i < n; i++)
{
var cntr=i,iA=i,iT=i,iC=i,iP=i,iI=i,iS=i;
var a=coinWallet.Coins[i].amount
var b=coinWallet.Coins[cntr++].amount
if (a<b)
{
var tempA = coinWallet.Coins[i].amount;
var tempT = coinWallet.Coins[i].type;
var tempC = coinWallet.Coins[i].CoinId;
var tempP = coinWallet.Coins[i].prvCoin;
var tempI = coinWallet.Coins[i].index;
var tempS = coinWallet.Coins[i].Spent;
coinWallet.Coins[i].amount = coinWallet.Coins[iA++].amount;
coinWallet.Coins[i].type = coinWallet.Coins[iT++].type;
coinWallet.Coins[i].CoinId = coinWallet.Coins[iC++].CoinId;
coinWallet.Coins[i].prvCoin = coinWallet.Coins[iP++].prvCoin;
coinWallet.Coins[i].index = coinWallet.Coins[iI++].index;
coinWallet.Coins[i].Spent = coinWallet.Coins[iS++].Spent;
coinWallet.Coins[iA++].amount = tempA;
coinWallet.Coins[iT++].type = tempT;
coinWallet.Coins[iC++].CoinId = tempC;
coinWallet.Coins[iP++].prvCoin = tempP;
coinWallet.Coins[iI++].index = tempI;
coinWallet.Coins[iS++].Spent = tempS;
swapp = true;
}
}
n--;
} while (swapp);
coinWallet.LstCoin=coinWallet.Coins[LastCoin].CoinId
var sendTransaction = getFactory().newConcept('com.libyan.coin.network', 'CoinTransaction')
sendTransaction.amount = transaction.amount
sendTransaction.type = "SEND"
sendTransaction.Spent = true
sendTransaction.CoinId = transaction.transactionId
if (transaction.sender.Coins) {
transaction.sender.Coins.push(sendTransaction)
} else {
transaction.sender.Coins= [sendTransaction]
}
var receiveTransaction = getFactory().newConcept('com.libyan.coin.network', 'CoinTransaction')
receiveTransaction.amount = transaction.amount
receiveTransaction.type = "RECEIVE"
receiveTransaction.Spent = false
receiveTransaction.CoinId =transaction.newTransactionId
receiveTransaction.prvCoin =transaction.sender.LstCoin
if (transaction.receiver.Coins) {
transaction.receiver.Coins.push(receiveTransaction)
} else {
transaction.receiver.Coins = [receiveTransaction]
}
return getAssetRegistry('com.libyan.coin.network.CoinWallet')
.then(function (assetRegistry) {
return assetRegistry.updateAll([transaction.sender, transaction.receiver])
})
.then(function () {
sendEvent("Transfer complete")
})
}
我希望我能找到可以帮助我的人。
你到处使用 i++
是不正确的。每次使用 i++ 时,它都会将 i 的值递增 1。
保持 for 循环使用它,但确保你也只去少于 n-1
for (var i=0; i < n - 1; i++)
然后赋值为i + 1的变量
let next = i + 1;
将 i++
的所有其他用途替换为 next
(不要更改 for 循环中的那个)
我正在开发一个项目,该项目有 "coinWallet" 资产,其中有一系列硬币。我想按升序和降序对这些硬币进行排序(排列),我尝试使用冒泡排序算法但它不起作用,我不知道为什么。 这是我的模型文件
namespace com.libyan.coin.network
abstract participant User identified by id {
o String id
o String name
}
participant Bank extends User {
o String swift optional
o BankType bankType optional
o Boolean Validator
}
participant Company extends User {
--> Bank bankID
}
participant Customer extends User {
--> Bank bankID
}
participant Issuer extends User {
o String swift optional
}
enum BankType {
o CommercialBank
}
asset CoinWallet identified by id {
o String id
o Double amount
--> User owner
o CoinTransaction[] Coins optional
o String LstCoin optional
}
concept CoinTransaction {
o Double amount
o CoinTransactionType type
o String CoinId optional
o String prvCoin optional
o Integer index optional
o Boolean Spent
}
enum CoinTransactionType {
o ISSUE
o SEND
o RECEIVE
}
transaction IssueCoin {
--> CoinWallet coinWallet
o Double amount
}
transaction TransferCoin {
--> CoinWallet sender
--> CoinWallet receiver
o Double amount
o String CoinId optional
}
event TransactionCompleted {
o String msg
}
transaction InitCustomer{}
transaction InitBank{
这是我的脚本
function onTransferCoin(transaction) {
spentvalidation(transaction.Spent)
if (transaction.sender.amount < transaction.amount) {
throw new Error('Insufficient fund')
}
if (transaction.sender ==transaction.receiver) { ///sender and reciver can't be the same
throw new Error('You can not send money from ur wallet to ur wallet')
}
var coinWallet=transaction.sender
transaction.sender.amount -= transaction.amount
transaction.receiver.amount += transaction.amount
var n=coinWallet.Coins.length
var LastCoin=coinWallet.Coins.length-1
var swapp;
do {
swapp = false;
for (var i=0; i < n; i++)
{
var cntr=i,iA=i,iT=i,iC=i,iP=i,iI=i,iS=i;
var a=coinWallet.Coins[i].amount
var b=coinWallet.Coins[cntr++].amount
if (a<b)
{
var tempA = coinWallet.Coins[i].amount;
var tempT = coinWallet.Coins[i].type;
var tempC = coinWallet.Coins[i].CoinId;
var tempP = coinWallet.Coins[i].prvCoin;
var tempI = coinWallet.Coins[i].index;
var tempS = coinWallet.Coins[i].Spent;
coinWallet.Coins[i].amount = coinWallet.Coins[iA++].amount;
coinWallet.Coins[i].type = coinWallet.Coins[iT++].type;
coinWallet.Coins[i].CoinId = coinWallet.Coins[iC++].CoinId;
coinWallet.Coins[i].prvCoin = coinWallet.Coins[iP++].prvCoin;
coinWallet.Coins[i].index = coinWallet.Coins[iI++].index;
coinWallet.Coins[i].Spent = coinWallet.Coins[iS++].Spent;
coinWallet.Coins[iA++].amount = tempA;
coinWallet.Coins[iT++].type = tempT;
coinWallet.Coins[iC++].CoinId = tempC;
coinWallet.Coins[iP++].prvCoin = tempP;
coinWallet.Coins[iI++].index = tempI;
coinWallet.Coins[iS++].Spent = tempS;
swapp = true;
}
}
n--;
} while (swapp);
coinWallet.LstCoin=coinWallet.Coins[LastCoin].CoinId
var sendTransaction = getFactory().newConcept('com.libyan.coin.network', 'CoinTransaction')
sendTransaction.amount = transaction.amount
sendTransaction.type = "SEND"
sendTransaction.Spent = true
sendTransaction.CoinId = transaction.transactionId
if (transaction.sender.Coins) {
transaction.sender.Coins.push(sendTransaction)
} else {
transaction.sender.Coins= [sendTransaction]
}
var receiveTransaction = getFactory().newConcept('com.libyan.coin.network', 'CoinTransaction')
receiveTransaction.amount = transaction.amount
receiveTransaction.type = "RECEIVE"
receiveTransaction.Spent = false
receiveTransaction.CoinId =transaction.newTransactionId
receiveTransaction.prvCoin =transaction.sender.LstCoin
if (transaction.receiver.Coins) {
transaction.receiver.Coins.push(receiveTransaction)
} else {
transaction.receiver.Coins = [receiveTransaction]
}
return getAssetRegistry('com.libyan.coin.network.CoinWallet')
.then(function (assetRegistry) {
return assetRegistry.updateAll([transaction.sender, transaction.receiver])
})
.then(function () {
sendEvent("Transfer complete")
})
}
我希望我能找到可以帮助我的人。
你到处使用 i++
是不正确的。每次使用 i++ 时,它都会将 i 的值递增 1。
保持 for 循环使用它,但确保你也只去少于 n-1
for (var i=0; i < n - 1; i++)
然后赋值为i + 1的变量
let next = i + 1;
将 i++
的所有其他用途替换为 next
(不要更改 for 循环中的那个)